我有以下表格:
users roles users_roles
-id (pk) -id (pk) -user_id (fk) references users
-username -name -role_id (fk) references roles
-password
我在角色列中有三条记录(ROLE_USER,ROLE_MODERATOR,ROLE_TESTER)
用户与角色之间在多对多关系中的关系。 我有一个表单字段(选择包含多个选择选项的角色的框),允许管理员根据选择框中的选择搜索用户。
假设管理员选择ROLE_USER和ROLE_MODERATOR。如何编写单个查询以查找具有此角色的用户(排除仅具有其中一个角色的用户)
这是sqlfiddle链接http://sqlfiddle.com/#!2/214b8/3
我想让用户同时拥有这两个角色(ROLES_USER和ROLES_MODERATOR)。用户必须具有两个角色
答案 0 :(得分:2)
试试这个。
SELECT DISTINCT users.id, users.username,group_concat(distinct roles.name) as role_names
FROM users
INNER JOIN users_roles ON users.id = users_roles.user_id
INNER JOIN roles ON roles.id = users_roles.role_id
WHERE roles.name = 'ROLE_USER' OR roles.name = 'ROLE_MODERATOR'
GROUP by users.id HAVING (role_names = 'ROLE_USER,ROLE_MODERATOR' OR role_names = 'ROLE_MODERATOR,ROLE_USER');
您可以自定义此查询以获取所需的列,并根据您的需要添加分组。
尽管我对这个查询结构并不完全满意,但我已将其作为临时解决方案。如果我们得到MySQL专家的任何评论,我会很高兴。
答案 1 :(得分:1)
您需要使用GROUP BY
和HAVING
:
SELECT user_id
FROM users_roles
WHERE role_id iN (1,2)
GROUP BY user_id
HAVING COUNT(DISTINCT role_id) = 2
以下是一些示例fiddle。
如果您需要JOIN
到其他表:
SELECT u.id, u.username
FROM users u
JOIN users_roles ur on u.id = ur.user_id
JOIN roles r on ur.role_id = r.id
WHERE r.id iN (1,2)
GROUP BY u.id, u.username
HAVING COUNT(DISTINCT r.id) = 2