【问题标题】:MySQL list users and their groupsMySQL 列出用户及其组
【发布时间】:2012-05-04 03:59:45
【问题描述】:

在 MySql 数据库中,我有表 user

user_id | user_name
--------+----------
1       | Joe
2       | Anna
3       | Max

group

group_id | group_name
---------+----------
1        | Red
2        | Blue
3        | Green

group_member

group_member_id | user_id | group_id
----------------+---------+---------
1               | 1       | 2
2               | 3       | 2
3               | 1       | 3 
3               | 2       | 1

所以...红色组的成员是 Anna,绿色组的成员是 Joe,蓝色组的成员是 Joe 和 max。

如何获取用户及其组的列表

User  | Group
------+------------
Joe   | Green, Blue
Anna  | Red
Max   | Blue 

【问题讨论】:

  • group 是关键字,请将表名 group 更改为其他名称!

标签: php mysql group-concat concat


【解决方案1】:
select u.user_name as users, group_concat(g.group_name) as groups
from `user` u 
join group_member gm on gm.user_id = u.user_id
join `group` g on g.group_id = gm.group_id
group by u.user_id;

【讨论】:

    【解决方案2】:
    SELECT u.user_name, GROUP_CONCAT(g.group_name)
    FROM `user` u
    inner JOIN group_member gm on gm.user_id = u.user_id
    inner JOIN `group` g on g.group_id = gm.group_id
    group by u.user_id
    

    【讨论】:

      【解决方案3】:

      您可以使用 MySQL 的 GROUP_CONCAT 函数来完成它。请注意,这会使您的查询不可移植(因为使用了 MySQL 扩展):

      SELECT user_name, GROUP_CONCAT(group_name)
      FROM user
      JOIN group_member USING (user_id)
      JOIN group USING (group_id)
      GROUP BY
             user_id
      

      我假设您在表上有合理的主键/唯一键(例如,给定的用户名不能在同一组中列出两次)。

      【讨论】:

      • +1 注意GROUP_CONCAT 的最大长度由group_concat_max_len 定义。它默认为 1024,但可以更改。因此,如果您的数据看起来被截断,这就是原因。
      • @MikeB:好点。虽然如果这成为一个问题,那么列表最好在应用程序代码中生成,而不是 DB IMO。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      相关资源
      最近更新 更多