0

我有如下表格:

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)。用户必须同时具有这两个角色

4

2 回答 2

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 专家那里得到任何评论,我会很棒。

于 2013-02-15T15:53:47.353 回答
1

您需要使用GROUP BYHAVING

SELECT user_id 
FROM users_roles 
WHERE role_id iN (1,2)
GROUP BY user_id 
HAVING COUNT(DISTINCT role_id) = 2

这是一些示例小提琴

如果你需要到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
于 2013-02-15T16:03:27.493 回答