mysql left join group_concat 主表丢失数据

时间:2024-11-01 09:16:22

问题出现的场景:

有一个主表 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;

结果: