查询按评论与评分总量排序的Top7用户及评论书籍总页数
问题修正与正确SQL查询
你的原查询存在几个关键问题,导致无法满足需求:
- 统计逻辑错误:用
SUM(reviews.reviews_id)统计评论数是错误的——字段名写错(应为review_id),且统计数量需用COUNT()而非SUM();另外需求中的“给出评分总数”是指评分的次数,不是评分的数值总和,原查询用SUM(ratings.rating)求的是评分总分,不符合要求。 - 连接方式问题:使用INNER JOIN会过滤掉只写评论没评分、或只评分没评论的用户,这些用户无法进入排名。
- 页数统计重复:若用户对同一本书多次评论,原查询会重复计算该书籍的页数,需去重后求和。
正确查询语句(兼容多数数据库)
SELECT username, SUM(total_reviews) AS total_reviews, SUM(total_rating_count) AS total_rating_count, SUM(total_book_pages) AS total_book_pages FROM ( -- 统计用户评论数及评论书籍的总页数(去重避免重复计算) SELECT username, COUNT(review_id) AS total_reviews, 0 AS total_rating_count, SUM(DISTINCT b.num_pages) AS total_book_pages FROM Reviews r LEFT JOIN Books b ON r.book_id = b.book_id GROUP BY username UNION ALL -- 统计用户评分次数 SELECT username, 0 AS total_reviews, COUNT(rating_id) AS total_rating_count, 0 AS total_book_pages FROM Ratings GROUP BY username ) user_stats GROUP BY username ORDER BY (total_reviews + total_rating_count) DESC LIMIT 7;
说明
- 两个子查询分别统计用户的评论数据和评分数据,用
UNION ALL合并后再按用户分组求和,确保不遗漏任何用户。 SUM(DISTINCT b.num_pages)确保同一本书的页数只计算一次,符合“所评论书籍的总页数”的需求。- 最终按「评论数+评分次数」的总和降序排序,取前7位用户。
内容的提问来源于stack exchange,提问作者SoapBubble
相关产品推荐
相关产品推荐

