我从来没有像常规选择查询那么多。我有一个新项目,其中包含users
,roles
和assigned_roles
(具有角色的用户的查找表)。
我想对roles
。name
进行group_concat,以便我的结果显示每个用户分配了哪些角色。
我尝试了几件事:
select users.id, users.displayname,users.email, rolenames from `users`
left join `assigned_roles` on `assigned_roles`.`user_id` = `users`.`id`
left join (SELECT `id`, group_concat(`roles`.`name`) as `rolenames` FROM `roles`) as uroles ON `assigned_roles`.`role_id` = `uroles`.`id`
这为我提供了分组的角色名称,但如果用户有两个角色,则会显示重复的条目,因此结果中的第二行显示相同的用户但没有角色名称。
select users.id, users.displayname,users.email, rolenames from `users`
join `assigned_roles` on `assigned_roles`.`user_id` = `users`.`id`
join (SELECT `id`, group_concat(`roles`.`name`) as `rolenames` FROM `roles`) as uroles ON `assigned_roles`.`role_id` = `uroles`.`id`
只是常规联接会显示我想要的内容,但不会列出没有任何assigned
。roles
的用户,因此不完整。
我会继续插手,但我认为堆栈可以提供帮助,希望我今天能更多地了解加入。
谢谢。
答案 0 :(得分:1)
要让GROUP CONCAT
在这种情况下工作,您需要GROUP BY
来获取每个用户的群组信息,例如;
SELECT u.id, u.displayname, u.email, GROUP_CONCAT(r.name) rolenames
FROM users u
LEFT JOIN assigned_roles ar ON ar.user_id = u.id
LEFT JOIN roles r ON r.id = ar.role_id
GROUP BY u.id, u.displayname, u.email