Доброе время суток,
Есть 3 табл.: «roles» (табл. c ролями), «roles_user» (связывающая табл), «user» (табл. c пользователями)
Мне нужно вытянуть всех пользователей с их ролями
Я создал запрос, который это делает:
SELECT tt1.*
,roles.name
FROM (
SELECT MAX(role_id) as maxrol
,tt.*
FROM (
SELECT users.*
,roles_users.role_id
FROM users
left join roles_users
on roles_users.user_id = users.id
left join roles
on roles_users.role_id = roles.id
) tt
GROUP BY tt.id
ORDER BY tt.role_id
) tt1
left join roles
on tt1.maxrol = roles.id
Результат запроса:
Вопрос:
Можно ли его упростить?
Как то так (не проверял, ибо создавать таблицы по картинкам тяжело):
SELECT U.*, R.name
FROM users U
LEFT JOIN (
SELECT user_id, MAX(role_id) as maxrol
FROM roles_users
GROUP BY user_id
) RU ON RU.user_id=U.id
LEFT JOIN roles R ON R.id=RU.maxrol
Можно как-то так написать:
SELECT
u.username,
r.name
FROM
users u,
roles r,
users_roles l
WHERE l.user_id = u.id
AND l.role_id = r.id;
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники