2013-02-09 54 views
1

好吧,所以我试图执行一个查询,它有4个表, 用户,事件,event_roles,user_event_role。MySQL使用分组来限制结果

用户可以填写多个角色。我试图做的是得到一个看起来更像这样的结果: 用户,事件,角色

因此,如果用户'Bill'与事件'Meeting'和'Bill'相关联,则会填充多个角色得到这样的结果:

user event  role 
-------------------------- 
bill Meeting admin 
bill Meeting director 

我将如何得到我的结果是这样的

user event  role role 
---------------------------------- 
bill Meeting admin director 

这里是我试图建立过的查询。

Select * 
    FROM `users` u 
LEFT JOIN `event_role` er ON u.user_id = er.user_id 
LEFT JOIN `events` e ON er.event_id = e.event_id 
+0

查询有什么问题? – 2013-02-09 21:49:28

回答

3

您寻求的结果是不可能的。

但是也有一些是接近:

SELECT 
    user, 
    event, 
    group_concat(role SEPARATOR ',') as roles 
FROM 
    `users` u 
    LEFT JOIN `event_role` er 
    ON u.user_id = er.user_id 
    LEFT JOIN `events` e 
    ON er.event_id = e.event_id 
GROUP BY u.user_id 

这将产生:

user event  roles 
---------------------- 
bill Meeting admin,director 

在您需要调整您的逻辑来正确分析这两种情况下。

+0

是的,谢谢,刚刚玩group_conact函数,虽然没有得到我想要的结果是在正确的轨道上,谢谢 – user1620152 2013-02-09 21:54:41

+0

不客气。 – scones 2013-02-09 21:55:26

1

你不能得到这样的结果,因为你不知道有多少角色有可能是(即列数),但你可以使用GROUP_CONCAT这样:

SELECT *, 
GROUP_CONCAT(event_roles.role SEPARATOR ',') as roles 
FROM users 
LEFT JOIN event_role USING(user_id) 
LEFT JOIN events USING(user_id) 
GROUP BY user_id 

使用这个查询,你会得到一切角色与,联合。但请注意GROUP_CONCAT的限制,默认值设置为1024个字符,可能不够(请参阅my.cnf)。

+0

关于字符限制的好提示,我只是得到了role_ids,而group by是非常必要的,因为没有它将每个用户的角色放到一个结果中。 – user1620152 2013-02-09 22:04:22