MySQL使用Group By来限制结果

时间:2013-02-09 21:44:20

标签: mysql sql

好的,所以我试图执行一个包含4个表的查询, 用户,事​​件,event_roles,user_event_role。

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

因此,如果用户'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

3 个答案:

答案 0 :(得分: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

在任何一种情况下,您都需要调整逻辑以正确解析它。

答案 1 :(得分: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)。

答案 2 :(得分:0)

像这样使用Group_concat(http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html)。 为了快速展示,我正在使用Ben Forta(http://www.forta.com/books/0672327120/)出色的MySQL介绍书中的数据库,没有任何隶属关系。

SELECT v.vend_id, GROUP_CONCAT(p.prod_id)
FROM products p 
JOIN  vendors v ON v.vend_id= p.vend_id
JOIN  orderitems oi ON oi.prod_id = p.prod_id
GROUP BY v.vend_id;