在mysql中获取多对多的关系

时间:2013-02-15 15:47:37

标签: mysql sql

我有以下表格:

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

2 个答案:

答案 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 BYHAVING

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