选择distinct无法正常工作(MySQL)

时间:2015-05-21 12:02:53

标签: mysql

我有这样的查询:

SELECT DISTINCT r.name AS role, r.id AS role_id, u.id AS user_id, concat( u.firstname, '', u.lastname ) AS name
FROM users u
INNER JOIN members m ON u.id = m.user_id
INNER JOIN member_roles mr ON m.id = mr.member_id
INNER JOIN roles r ON r.id = mr.role_id
WHERE m.project_id =11

我的目标是获得唯一的u.id(user_id)。不幸的是,结果显示来自此多个联接的两个重复u.id。如果我删除最后一个连接(INNER JOIN roles r ON r.id = mr.role_id),则此查询正确运行。但是如果我将这一行添加到我的查询中,我不知道为什么会出错。获取角色名称需要最后一行join,所以我可以忽略它。有人可以告诉我在查询中我做错了吗?

2 个答案:

答案 0 :(得分:1)

在查询中使用GROUP BY获取具有唯一user_id的行。

然后更新的查询将如下所示。

SELECT DISTINCT r.name AS role, r.id AS role_id, u.id AS user_id, 
concat( u.firstname, '', u.lastname ) AS name
FROM users u
INNER JOIN members m ON u.id = m.user_id
INNER JOIN member_roles mr ON m.id = mr.member_id
INNER JOIN roles r ON r.id = mr.role_id
WHERE m.project_id =11 GROUP BY user_id

答案 1 :(得分:1)

您错过了用户可以在项目中拥有多个角色的事实。幸运的是,MySQL有group_concat()可以将多个值组合在一起:

SELECT u.id AS user_id, concat( u.firstname, '', u.lastname ) AS name,
       GROUP_CONCAT(r.name) as roles,
       GROUP_CONCAT(r.id) as role_ids
FROM users u INNER JOIN
     members m
     ON u.id = m.user_id INNER JOIN
     member_roles mr ON m.id = mr.member_id INNER JOIN
     roles r
     ON r.id = mr.role_id
WHERE m.project_id = 11
GROUP BY u.id;