Как я могу запросить базу данных MySQL для возврата ролей, которые все еще не назначены (как доступно для него).
С таблицей user_roles:
|user_id|role_id|
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
| 1 | 7 |
Как я могу запросить таблицу ролей, чтобы вернуть имя роли и идентификатор всех ролей, которые не назначены. role_id: 3,5,8,...
Попробуйте
SELECT *
FROM roles r
WHERE NOT EXISTS (
SELECT 1
FROM user_roles ur
WHERE ur.role_id = r.id
AND ur.user_id = 1
)
Я предпочитаю делать такой запрос набора-дополнений, используя внешнее соединение, вместо коррелированных или некоррелированных подзапросов.
SELECT r.id
FROM roles r
LEFT OUTER JOIN user_roles u
ON r.id = u.role_id AND u.user_id = 1
WHERE u.role_id IS NULL;
SELECT *
FROM roles
WHERE roles.id NOT IN (SELECT distinct role_id FROM user_roles)
если вам нужны роли, не назначенные пользователю 1.
SELECT *
FROM roles
WHERE roles.id NOT IN (SELECT distinct role_id FROM user_roles WHERE NOT user_ID = 1)
Примечание. Это намного быстрее, чем принятый ответ, поскольку он выполняет только один запрос и один раз для каждой строки в ролях.