@quitting
Junior php

Как правильно составить sql запрос для моей задачи?

Есть три таблицы `user`, `user_role`, `access_group`

В `user` инфа пользователя (логин, пароль, и т.д.)

В `access_group` роли или группы ролей (один пользователь может иметь много ролей)
606ad68bc1f6b870136071.png

В `user_role` связь между таблицами выше.
606ad65ddc872688127131.png

Задача состоит в то чтобы отобразить инфу о пользователе и его роли в формате:
| log_user | | email_user | role1, role2, role3 |

Но загвоздка еще в поиске по ролям. Можно указать несколько ролей для поиска. Т.е. искать юзеров например с role1, role2 и отобразить инфу о них со всеми ролями включая role3.

Я написал громоздкий запрос для решения этой задачи. Возможно вы мне подскажите решение попроще.

SELECT
    `t1`.*,
    GROUP_CONCAT(`t3`.`name` SEPARATOR ', ') AS `role_group`
FROM
    `user` AS `t1`
JOIN `user_role` AS `t2`
ON
    `t1`.`id` = `t2`.`user_id`
JOIN `access_group` AS `t3`
ON
    `t2`.`group_id` = `t3`.`id`
WHERE
    `t1`.`id` IN(
    SELECT
        `user_id`
    FROM
        `user_role`
    WHERE
        `group_id` IN('20', '24')
    GROUP BY
        `user_id`
    HAVING
        COUNT(`user_id`) >= 2
)
GROUP BY
    `t1`.`id`
LIMIT 0, 20


Если чесно он меня пугает(
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Можно упростить запрос следующим образом:
SELECT
    `t1`.*,
    GROUP_CONCAT(`t3`.`name` SEPARATOR ', ') AS `role_group`
FROM
    `user` AS `t1`
JOIN `user_role` AS `t2`
ON
    `t1`.`id` = `t2`.`user_id`
JOIN `access_group` AS `t3`
ON
    `t2`.`group_id` = `t3`.`id`
GROUP BY
    `t1`.`id`
HAVING SUM(`group_id` IN('20', '24'))  = 2
LIMIT 0, 20


MySQL fiddle
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы