合并两条分类相关SQL查询时报错#1241该如何解决
报错原因解析
你遇到的#1241 - Operand should contain 1 column(s)错误是因为合并后的SQL中,WHERE条件的OR关键字后面直接跟了返回多列的子查询。OR两侧需要是可判断真假的布尔表达式,而你写的子查询返回的是category表的所有字段,不属于布尔判断逻辑,数据库无法识别,因此抛出列数不匹配的错误。
另外你的第一个原始查询逻辑也存在问题:用INNER JOIN article搭配article.category != category.id的条件会产生笛卡尔积,查询结果不是你想要的「无对应博客文章的子分类」,正确逻辑应该是用左连接判断关联的文章为空。
正确合并方案
你需要的是两个结果集的合集,应该用UNION操作符实现,注意要保证两个查询返回的字段数量、字段类型完全一致:
-- 第一部分:查询无对应博客文章的子分类 SELECT c.id, c.name, c.parent, NULL AS article_id FROM category c LEFT JOIN article a ON a.category = c.id WHERE c.parent IS NOT NULL AND a.id IS NULL GROUP BY c.id UNION -- 第二部分:查询所有没有子分类的顶级分类 SELECT c.id, c.name, c.parent, NULL AS article_id FROM category c WHERE c.parent IS NULL AND c.id NOT IN ( SELECT parent FROM category WHERE parent IS NOT NULL )
逻辑说明
- 第一部分用
LEFT JOIN关联文章表,通过a.id IS NULL筛选出没有对应文章的子分类(c.parent IS NOT NULL筛选子分类) - 第二部分查询顶级分类(
c.parent IS NULL)中没有子分类的项,逻辑和你原逻辑一致 - 两个查询返回的字段完全对齐,用
UNION自动去重得到合集,如果你不需要去重可以换成UNION ALL提升性能
内容的提问来源于stack exchange,提问作者cyrilovh
相关产品推荐
相关产品推荐

