mysql left join group_concat 主表丢失数据

问题出现的场景:

有一个主表 a,一个子表 b

a表有两条数据,a表第一条数据在b表中有一条子数据,a表第二条数据在b表中有两条子数据。

现在想要查询出来a表的所有数据和a表的子表b的id,b的id 使用GROUP_CONCAT拼接

有问题的sql:

select
        sr.script_catalog_id,
		sr.name,
		sr.user_id,
        u.loginname,
		sr.create_time,
        sr.update_time,
        GROUP_CONCAT(tds.script_id) AS sids,
		sr.status
        FROM t_dg_script_catalog sr
        left join t_dg_script tds on sr.script_catalog_id = tds.script_catalog_id 
        left join t_dg_user u on u.user_id = sr.user_id
        where sr.status =1;

结果:

预期是要把主表的两条数据都查询出来,但是只查询出来一条结果,并且结果sids不对

解决方案:

1、因为主表的id是不重复,根据主表id分组,然后 GROUP_CONCAT拼接子表id

select
        sr.script_catalog_id,
		sr.name,
		sr.user_id,
        u.loginname,
		sr.create_time,
        sr.update_time,
        GROUP_CONCAT(tds.script_id) AS sids,
		sr.status
        FROM t_dg_script_catalog sr
        left join t_dg_script tds on sr.script_catalog_id = tds.script_catalog_id 
        left join t_dg_user u on u.user_id = sr.user_id
        where sr.status =1 
        GROUP BY sr.script_catalog_id;

2、使用子查询,先把子表分组并获取子表id,然后再左连接,拿出子表GROUP_CONCAT出来的id

select
        sr.script_catalog_id,
		sr.name,
		sr.user_id,
        u.loginname,
		sr.create_time,
        sr.update_time,
        abc.sids,
		sr.status
        FROM t_dg_script_catalog sr
        left join t_dg_user u on u.user_id = sr.user_id
        left join(select script_catalog_id,GROUP_CONCAT(script_id) as sids from t_dg_script tds group by script_catalog_id ) abc on abc.script_catalog_id = sr.script_catalog_id
        where sr.status =1;

3、根据查询出来的字段分组,然后 GROUP_CONCAT拼接子表id

select
        sr.script_catalog_id ,
        sr .name ,
        sr .user_id ,
        sr .create_time ,
        sr .update_time ,
        sr.status ,
        GROUP_CONCAT(tds.script_id) AS sids
        FROM t_dg_script_catalog sr
        left join t_dg_script tds on sr.script_catalog_id = tds.script_catalog_id 
        where sr.status =1
        group by sr.script_catalog_id ,
        sr .name ,
        sr .user_id ,
        sr .create_time ,
        sr .update_time ,
        sr.status;

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值