无需HAVING,用WHERE/JOIN实现GROUP_CONCAT LIKE查询保留全量关联模块
解决方案
你现有查询的问题是WHERE子句在分组前执行,直接过滤掉了所有模块名不匹配%module1%的关联行,因此GROUP_CONCAT只能聚合到剩余的module1记录。不使用HAVING的前提下,可以通过先筛选符合条件的客户端ID,再关联全量模块的方式实现需求,以下是两种可行方案:
方案1:WHERE子句搭配子查询实现
SELECT c.id, c.name, GROUP_CONCAT(m.name) AS modules FROM client c LEFT JOIN client_module cm ON cm.client_id = c.id LEFT JOIN module m ON m.id = cm.module_id WHERE c.id IN ( SELECT DISTINCT cm2.client_id FROM client_module cm2 JOIN module m2 ON m2.id = cm2.module_id WHERE m2.name LIKE '%module1%' ) GROUP BY c.id, c.name
逻辑说明:子查询先查出所有绑定了module1的客户端ID,外层查询直接基于这部分ID拉取对应客户端的全部绑定模块,过滤逻辑完全在WHERE子句中完成。
方案2:JOIN条件实现
SELECT c.id, c.name, GROUP_CONCAT(m.name) AS modules FROM client c -- 先关联匹配到module1的客户端,过滤掉不符合条件的客户端 JOIN ( SELECT DISTINCT cm2.client_id FROM client_module cm2 JOIN module m2 ON m2.id = cm2.module_id WHERE m2.name LIKE '%module1%' ) filtered_c ON filtered_c.client_id = c.id -- 再关联全量的客户端模块关系和模块表 LEFT JOIN client_module cm ON cm.client_id = c.id LEFT JOIN module m ON m.id = cm.module_id GROUP BY c.id, c.name
逻辑说明:通过INNER JOIN先把没有绑定module1的客户端直接排除,后续关联拉取剩余客户端的全量模块即可,过滤逻辑完全通过JOIN条件实现。
内容的提问来源于stack exchange,提问作者Rezigdev.com
相关产品推荐
相关产品推荐

