【问题标题】:MySQL Select Last 10 Rows Using WHERE AVG()MySQL 使用 WHERE AVG() 选择最后 10 行
【发布时间】:2012-04-26 20:45:34
【问题描述】:

我正在尝试提取平均评分高于 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

【问题讨论】:

    标签: mysql group-by average


    【解决方案1】:

    无法测试,但也许可以:

    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 是您的朋友。

    【讨论】:

    • 谢谢,我选择了一个更快的变体(见上文)0.2s vs 60.9s
    【解决方案2】:

    我认为您需要使用HAVING 语法。像这样:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2015-09-21
      • 2011-05-12
      • 2011-07-03
      相关资源
      最近更新 更多