Мне нужно ограничить пользовательский запрос относительно пользовательских ролей (пользователя или администратора).
В datatbase есть таблица user_scope
содержащая все идентификаторы пользователей и назначенные роли (у каждого пользователя есть одна запись с 1 для пользователя, а у некоторых есть вторая запись с 2 для администратора). Я не могу изменить эту архитектуру базы данных прямо сейчас.
Это мой SELECT для users
таблицы до сих пор, который объединяет данные из других таблиц
SELECT
u.id,
GROUP_CONCAT(DISTINCT scopes.scope ORDER BY scopes.id ASC SEPARATOR ' ') as scope
FROM users as u
LEFT JOIN user_scope on user_scope.user_id = u.id
LEFT JOIN scopes on scopes.id = user_scope.scope_id
В таблице users
+----+--------+
| id | parent |
+----+--------+
| 1 | Alex |
| 2 | Marc |
| 3 | Cath |
+----+--------+
Таблица user_scope
+---------+----------+
| user_id | scope_id |
+---------+----------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 1 |
+---------+----------+
Табличные scopes
+----+--------+
| id | scope |
+----+--------+
| 1 | user |
| 2 | admin |
+----+--------+
Это даст что-то вроде этого
+----+------------+
| id | scope |
+----+------------+
| 1 | user admin |
| 2 | user |
| 3 | user |
+----+------------+
Проблема возникает, когда я хочу фильтровать результаты на основе одной конкретной роли. Я попробовал это
SELECT
u.id,
GROUP_CONCAT(DISTINCT scopes.scope ORDER BY scopes.id ASC SEPARATOR ' ') as scope
FROM users as u
LEFT JOIN user_scope on user_scope.user_id = u.id
LEFT JOIN scopes on scopes.id = user_scope.scope_id and scopes.id = 2
Или 1 соответственно. Тем не менее, это не уменьшит количество возвращенных строк, но будет только NULL строк с пользователями, у которых нет области admin
. Я также пытался использовать CASE
но я не могу ни использовать это в инструкции WHERE.
Как уменьшить строки, возвращенные в этом контексте? Помощь ДЕЙСТВИТЕЛЬНО оценена.
Используйте условие having
:
SELECT u.id,
GROUP_CONCAT(DISTINCT s.scope ORDER BY s.id ASC SEPARATOR ' ') as scopes
FROM users u LEFT JOIN
user_scope us
ON us.user_id = u.id LEFT JOIN
scopes s
ON s.id = us.scope_id
GROUP BY u.id
HAVING MAX(s.id = 2) > 0;
MAX(s.id = 2) < 1
я мог поймать случай «только для пользователей». Спасибо за вашу помощь. Это высоко ценится.
GROUP BY
.