如何简化同表双条件LEFT JOIN的SQL语句?解决语法错误问题
解决方法:用条件聚合合并LEFT JOIN
你的错误出在CASE WHEN的用法上——CASE是一个返回单个值的表达式,没法在里面直接定义两个不同的列别名。要合并成单个LEFT JOIN,得用条件聚合的思路:为每个目标列(workers、writers)单独调用GROUP_CONCAT,同时用条件过滤只包含对应lv的name值。
正确的SQL写法(两种可选)
方式1:用CASE WHEN实现条件聚合
SELECT a.id, bc.workers, bc.writers FROM table_a a LEFT JOIN ( SELECT aid, -- 只聚合lv=1的name,其他行返回NULL,GROUP_CONCAT会自动忽略NULL GROUP_CONCAT(CASE WHEN lv = 1 THEN name END) AS workers, GROUP_CONCAT(CASE WHEN lv = 2 THEN name END) AS writers FROM table_b GROUP BY aid ) bc ON bc.aid = a.id;
方式2:用IF函数简化(MySQL/MariaDB专属)
如果用的是MySQL或MariaDB,用IF函数会更简洁,效果和上面完全一致:
SELECT a.id, bc.workers, bc.writers FROM table_a a LEFT JOIN ( SELECT aid, GROUP_CONCAT(IF(lv = 1, name, NULL)) AS workers, GROUP_CONCAT(IF(lv = 2, name, NULL)) AS writers FROM table_b GROUP BY aid ) bc ON bc.aid = a.id;
要不要保留原来的两个LEFT JOIN?
- 如果
table_b的数据量不大,合并后的写法更简洁,减少了一次JOIN操作,性能不会差甚至更好。 - 如果
table_b非常庞大,且lv=1和lv=2的数据集差异极大(比如其中一个占比极低),原来的两个子查询因为提前过滤了数据,可能会更快。但这种场景比较少见,大多数情况下推荐用合并后的写法。
内容的提问来源于stack exchange,提问作者Toleo
相关产品推荐
相关产品推荐

