MySQL 使用 WHERE AVG() 选择最后 10 行

标签 mysql group-by average

我正在尝试拉出平均评分高于 4 的最后 10 行的列表。现在这是通过从第一个表中选择然后检查平均值是否高于 4 来完成的,如果不是则将其添加到变量中它什么都不做。这是一种糟糕的方法,尤其是当行数超过 1000 行时。

这是两个查询:

SELECT * FROM `CLMS_reviews` WHERE id = 465 ORDER BY date DESC

SELECT 
rc.name, rr.rating
FROM `CLMS_reviews_ratings` rr  
LEFT JOIN `CLMS_reviews_categories` rc ON rc.cat_id = rr.cat_id  AND rc.website_id = 465
WHERE rr.review_id = " . $row['id'] . "
GROUP BY rc.name

如何将其合并为一个查询?我试过了,但对 GROUP BY 的使用无效:

SELECT 
rr.review_id
FROM `CLMS_reviews` r
LEFT JOIN `CLMS_reviews_ratings` rr ON rr.review_id = r.id
WHERE r.website_id = 465 AND AVG(rr.rating) > 4
GROUP BY rr.review_id LIMIT 10

下面的解决方案:

SELECT review_id FROM `CLMS_reviews_ratings`
WHERE review_id IN ((SELECT id FROM `CLMS_reviews` WHERE website_id = 465))
GROUP BY review_id
HAVING avg(rating) > 4
LIMIT 10

最佳答案

无法测试,但也许可以:

SELECT rr.review_id
  FROM `CLMS_reviews` r
  LEFT JOIN `CLMS_reviews_ratings` rr ON rr.review_id = r.id
 WHERE r.website_id = 465
 GROUP BY rr.review_id
HAVING avg(rr.rating) > 4
 LIMIT 10;

如果您需要对聚合函数进行过滤,HAVING 是您的 friend 。

关于MySQL 使用 WHERE AVG() 选择最后 10 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341183/

相关文章:

c# - MySQL 到 MS ACCESS 2007?

不同行的 MySQL 时区

PostgreSQL - 使用 AVG、MAX 和 MIN 进行规范化

linq - 如何在 Linq 中订购组结果?

mysql - 获取另一个mysql的列和值的平均值

C++无法完成 double 值的平均计算

mysql - 从表 A 中删除不在的地方(另外两个表)

mysql - SQL 将通配符与变量占位符相结合

Python Groupby 和绘图

mysql - SQL 从具有该值的不同 id 的列中选择值