查询撰写最多低于商家平均评分评论的用户:SQL语句校验与修正
SQL语句校验与修正
原SQL存在以下问题:
- 字段名错误:
reviews表中用户名字段为user_name,而非username;查询中多余的name字段(商家名称)不符合分组规则,严格SQL模式下会报错,且需求无需返回该字段。 - JOIN写法错误:使用
CROSS JOIN搭配ON条件属于不规范写法,此处应使用INNER JOIN来关联两张表(通过place_id与id匹配)。 - 数据类型不匹配隐患:
places表中average_rating字段定义为INT,但插入的是小数(如4.9),实际会被截断为整数,导致评分比较逻辑失效,需将该字段类型改为DECIMAL(3,1)这类支持小数的类型。
修正后的SQL语句:
SELECT r.user_name, COUNT(*) AS low_rating_review_count FROM reviews r INNER JOIN places p ON p.id = r.place_id WHERE r.rating < p.average_rating GROUP BY r.user_name ORDER BY low_rating_review_count DESC LIMIT 1;
额外说明:
- 给表添加别名(
r代表reviews,p代表places)让语句更简洁易读。 - 给统计结果列起别名
low_rating_review_count,语义更清晰。 - 若存在多个用户并列第一的情况,
LIMIT 1只会返回其中一个,若要返回所有并列用户,可改用窗口函数实现:
SELECT user_name, low_rating_review_count FROM ( SELECT r.user_name, COUNT(*) AS low_rating_review_count, RANK() OVER(ORDER BY COUNT(*) DESC) AS rank_num FROM reviews r INNER JOIN places p ON p.id = r.place_id WHERE r.rating < p.average_rating GROUP BY r.user_name ) AS ranked_reviews WHERE rank_num = 1;
内容的提问来源于stack exchange,提问作者Pantomima
相关产品推荐
相关产品推荐

