Включить роль администратора в таблицу пользователей из таблицы ролей
Вопрос
Есть ли способ запросить таблицу пользователей следующим образом:
| id | username |
-----------------
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
и таблица user_roles:
| id_user | id_role |
---------------------
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
предполагая, что роль с id = 1 является ролью администратора, для получения результата, который выглядит следующим образом:
| id | username | admin |
-------------------------
| 1 | user1 | Y |
| 2 | user2 | N |
| 3 | user3 | Y |
Я думаю, это можно сделать с помощью вложенных операторов SELECT, но мне было интересно, выполнимо ли это с помощью JOIN .
Редактировать:Значение столбца admin не обязательно должно быть Y или N, это может быть идентификатор роли администратора (1) или NULL или что-то еще, что позволит мне узнать, является ли пользователь администратором
Решение
Я бы попробовал это:
select u.id, u.username, if (id_role is null, 'N', 'Y') as is_admin
from users u
left outer join user_roles r
on u.id = r.id_user and r.id_role = 1
Но я не уверен на 100%.
Другие советы
Что ж, вы можете присоединиться вот так, что даст вам id_role
в результате.
SELECT u.*, r.id_role
FROM users u
LEFT JOIN user_roles r
ON u.id=r.id_user
Вы можете добавить WHERE r.id_role=1
чтобы получить только администраторов и т.д.
Но чтобы получить имя администратора как "Y" или "N", как вы хотели, вы можете использовать IF
от того, равен ли id_role 1 или нет.
SELECT u.*, IF(r.id_role = 1, "Y", "N") as admin
FROM users u
LEFT JOIN user_roles r
ON u.id=r.id_user
select u.id_user, if(count(1) > 0, 'Y', 'N')
from user u left outer join user_roles ur on u.user_id = ur.user_roles
where ur.id_role=1
group by u.id_user
Я не использую mysql, поэтому просто погуглил, у него есть функция 'if', если это неправильно, замените на DECODE, COALESCE или что-то подобное.