Включить роль администратора в таблицу пользователей из таблицы ролей - PullRequest
1 голос
/ 14 января 2010

Есть ли способ запросить таблицу пользователей следующим образом:

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

Edit: Значение столбца администратора не обязательно должно быть Y или N, это может быть идентификатор роли администратора (1) или NULL, или что-то еще, что даст мне знать, если пользователь является администратором

Ответы [ 3 ]

1 голос
/ 14 января 2010

Я бы попробовал это:

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

1 голос
/ 14 января 2010

Ну, вы можете присоединиться вот так, что даст вам 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
0 голосов
/ 14 января 2010
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 или тому подобное.

...