我有这样的查询:
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
,所以我可以忽略它。有人可以告诉我在查询中我做错了吗?
答案 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;