问题出现的场景:
有一个主表 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;
结果: