1

好的,所以我正在尝试执行一个包含 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
4

3 回答 3

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

无论哪种情况,您都需要调整逻辑以正确解析它。

于 2013-02-09T21:53:36.253 回答
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)。

于 2013-02-09T21:56:34.920 回答
0

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

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;
于 2013-02-09T22:15:29.503 回答