SQL查询无专辑乐队名称时如何仅返回单列?GROUP BY报错解决
问题解答
为什么第一个SQL报错?
你遇到的1055错误是因为MySQL的sql_mode=only_full_group_by模式要求:SELECT列表中的非聚合列必须要么出现在GROUP BY子句中,要么与GROUP BY子句中的列存在函数依赖关系。
你的第一个SQL里,GROUP BY albums.band_id,但SELECT的是bands.name——当乐队没有专辑时,albums.band_id是NULL,这时候bands.name和NULL没有任何函数依赖,数据库无法确定要返回哪个值,所以触发报错。
能不能SELECT列A而GROUP BY列B?
只有当列A函数依赖于列B时才可以:
- 比如如果B是表的主键,那么同表的其他列(比如A)都依赖于主键B,数据库能确定每个B对应唯一的A值,这时候可以只GROUP BY B,SELECT A。
- 如果没有这种依赖关系,在
only_full_group_by模式下必须把A加入GROUP BY,或者对A使用聚合函数(比如MAX(A))明确指定返回该组的哪个A值。
如何仅返回无专辑乐队的名称(单列)?
有几种更简洁的方法:
方法1:利用主键的函数依赖简化GROUP BY
因为bands.id是主键,bands.name依赖于它,所以可以只GROUP BYbands.id,同时只SELECT名称:
SELECT b.name AS 'Band Name' FROM bands b LEFT JOIN albums a ON b.id = a.band_id GROUP BY b.id HAVING COUNT(a.id) = 0;
方法2:用LEFT JOIN + IS NULL(更高效)
不需要分组,直接筛选左连接后没有匹配到专辑的乐队:
SELECT b.name AS 'Band Name' FROM bands b LEFT JOIN albums a ON b.id = a.band_id WHERE a.band_id IS NULL;
方法3:用NOT IN子查询
找出所有ID不在专辑表的乐队ID列表里的乐队:
SELECT name AS 'Band Name' FROM bands WHERE id NOT IN (SELECT DISTINCT band_id FROM albums WHERE band_id IS NOT NULL);
这里加WHERE band_id IS NOT NULL是避免子查询返回NULL,导致NOT IN逻辑失效。
内容的提问来源于stack exchange,提问作者user21719055
相关产品推荐
相关产品推荐

