SQL子查询使用COUNT()报语法错误,如何同时统计含love和hate的评论数量
SQL查询报错修复与统计方案
报错原因
你编写的SQL存在两个核心问题:
- COUNT()函数中不能直接嵌套子查询,作为标量返回的子查询需要整体用括号包裹,且统计逻辑要放在子查询内部
- 外层冗余的
FROM review会导致子查询逐行重复执行,既浪费性能,还会返回和评论表行数一致的重复统计结果,属于无效语法
修正方案
方案1:调整原有子查询逻辑
如果你要保留原有子查询的写法,只需要调整括号位置、去掉外层冗余的表引用即可,修改后代码如下:
SELECT (SELECT COUNT(id) FROM review WHERE text LIKE '%love%') AS NumLove, (SELECT COUNT(id) FROM review WHERE text LIKE '%hate%') AS NumHate;
方案2:性能更优的条件聚合写法
上述写法需要遍历两次评论表,数据量大的时候效率较低,推荐使用条件聚合只遍历一次表完成统计:
SELECT SUM(CASE WHEN text LIKE '%love%' THEN 1 ELSE 0 END) AS NumLove, SUM(CASE WHEN text LIKE '%hate%' THEN 1 ELSE 0 END) AS NumHate FROM review;
直接对比结果的写法
如果需要直接得到哪类评论更多的结论,可以在上述统计基础上增加判断逻辑:
SELECT NumLove, NumHate, CASE WHEN NumLove > NumHate THEN '包含love的评论数量更多' WHEN NumHate > NumLove THEN '包含hate的评论数量更多' ELSE '两类评论数量相等' END AS compare_result FROM ( SELECT SUM(CASE WHEN text LIKE '%love%' THEN 1 ELSE 0 END) AS NumLove, SUM(CASE WHEN text LIKE '%hate%' THEN 1 ELSE 0 END) AS NumHate FROM review ) AS stat_result;
内容的提问来源于stack exchange,提问作者Mary Restivo
相关产品推荐
相关产品推荐

