如何在 mysql 的 Group_concat 子查询中使用选择查询

Posted

技术标签:

【中文标题】如何在 mysql 的 Group_concat 子查询中使用选择查询【英文标题】:how to use select query in a Group_concat sub query in mysql 【发布时间】:2017-09-11 10:34:18 【问题描述】:

我有 3 张桌子:

tbl_user 存储所有用户详细信息(用户 ID、姓名、地址)

user_id    name        address
1         a (shop)      home
2         b (shop)    bakerstreet
3         c (staff)   wallstreet
4         d (staff)    georgia
5         e (staff)    sydney

tbl_user_group 存储用户类型(user_id,user_type : 1=shop_owner,2=staff)

user_id    user_type
1             1
2             1
3             2
4             2
5             2

tbl_user_association 保存 shop_owner 和 staff 关系(shop_owner_id,staff_id)

shop_owner_id    staff_id
1                3
1                4
1                5
2                3
2                4

想要的结果

我想显示员工列表和他们关联的各个商店,如下所示:

user_id    staff_name    shop_owner
3          c             a,b  
4          d             a,b
5          e             a

我尝试使用here 中提到的 group_concat。查询如下:

SELECT
u.id                          AS user_id,
u.name                        AS staff_name,
(SELECT GROUP_CONCAT(u.name separator ',') FROM tbl_user u WHERE u.id = ua.shop_owner_id) AS 
shop_owner
FROM tbl_user u
JOIN tbl_user_group ug ON u.id = ug.user_id
LEFT JOIN tbl_user_association ua ON u.id = ua.staff_id
WHERE ug.user_type = 2
GROUP BY u.id

但它会返回单行五线谱,如下所示。我哪里出错了?

user_id    staff_name  shop_owner
3              c        a
4              d        a
5              e        a

【问题讨论】:

(GROUP_CONCAT(u.name separator '')) AS shop_owner替换(SELECT GROUP_CONCAT(u.name separator ',') FROM tbl_user u WHERE u.id = ua.shop_owner_id) AS shop_owner and in where 子句u.id = ua.shop_owner_id 【参考方案1】:

这就是我的做法:

SELECT
    u.user_id,
    u.name,
    GROUP_CONCAT( so.name )
FROM
    tbl_user_group ug
    INNER JOIN tbl_user u
        ON ( ug.user_id = u.user_id )
    INNER JOIN tbl_user_association ua
        ON ( ua.staff_id = u.user_id )
    INNER JOIN tbl_user so -- here join again the user table to get shop owners names
        ON ( ua.shop_owner_id = so.user_id )
WHERE
    ug.user_type = 2
GROUP BY
    u.user_id;

【讨论】:

以上是关于如何在 mysql 的 Group_concat 子查询中使用选择查询的主要内容,如果未能解决你的问题,请参考以下文章

当我在查询中使用“GROUP_CONCAT”和“HAVING”时如何计算 MySQL 结果?

如何在Mysql中组合两列和group_concat

MySQL 如何对特定字段进行 GROUP_CONCAT?

如何仅使用“group_concat”过滤表 mysql 中的行

如何在 mysql 的 Group_concat 子查询中使用选择查询

如何在 MySql 的 CONCAT 和 SUM VALUES 中使用 GROUP_CONCAT