Ограничить результаты SQL с помощью GROUP_CONCAT и LEFT JOIN

0

Мне нужно ограничить пользовательский запрос относительно пользовательских ролей (пользователя или администратора).

В 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.

Как уменьшить строки, возвращенные в этом контексте? Помощь ДЕЙСТВИТЕЛЬНО оценена.

  • 1
    В вашем запросе отсутствует GROUP BY .
Теги:

1 ответ

1
Лучший ответ

Используйте условие 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;
  • 0
    Большой! Работал. И с MAX(s.id = 2) < 1 я мог поймать случай «только для пользователей». Спасибо за вашу помощь. Это высоко ценится.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню