问题出现的场景:
有一个主表 a,一个子表 b
a表有两条数据,a表第一条数据在b表中有一条子数据,a表第二条数据在b表中有两条子数据。
现在想要查询出来a表的所有数据和a表的子表b的id,b的id 使用GROUP_CONCAT拼接
有问题的sql:
selectsr.script_catalog_id,sr.name,sr.user_id,u.loginname,sr.create_time,sr.update_time,GROUP_CONCAT(tds.script_id) AS sids,sr.statusFROM t_dg_script_catalog srleft 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_idwhere sr.status =1;
结果:
预期是要把主表的两条数据都查询出来,但是只查询出来一条结果,并且结果sids不对
解决方案:
1、因为主表的id是不重复,根据主表id分组,然后 GROUP_CONCAT拼接子表id
selectsr.script_catalog_id,sr.name,sr.user_id,u.loginname,sr.create_time,sr.update_time,GROUP_CONCAT(tds.script_id) AS sids,sr.statusFROM t_dg_script_catalog srleft 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_idwhere sr.status =1 GROUP BY sr.script_catalog_id;
2、使用子查询,先把子表分组并获取子表id,然后再左连接,拿出子表GROUP_CONCAT出来的id
selectsr.script_catalog_id,sr.name,sr.user_id,u.loginname,sr.create_time,sr.update_time,abc.sids,sr.statusFROM t_dg_script_catalog srleft join t_dg_user u on u.user_id = sr.user_idleft 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_idwhere sr.status =1;
3、根据查询出来的字段分组,然后 GROUP_CONCAT拼接子表id
selectsr.script_catalog_id ,sr .name ,sr .user_id ,sr .create_time ,sr .update_time ,sr.status ,GROUP_CONCAT(tds.script_id) AS sidsFROM t_dg_script_catalog srleft join t_dg_script tds on sr.script_catalog_id = tds.script_catalog_id where sr.status =1group by sr.script_catalog_id ,sr .name ,sr .user_id ,sr .create_time ,sr .update_time ,sr.status;
结果: