mysql加入关系查找

时间:2014-04-27 16:37:47

标签: mysql

我从来没有像常规选择查询那么多。我有一个新项目,其中包含usersrolesassigned_roles(具有角色的用户的查找表)。

我想对rolesname进行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`

只是常规联接会显示我想要的内容,但不会列出没有任何assignedroles的用户,因此不完整。

我会继续插手,但我认为堆栈可以提供帮助,希望我今天能更多地了解加入。

谢谢。

1 个答案:

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