1

平均評価が4を超える最後の10行のリストを取得しようとしています。現在、これは最初のテーブルから選択し、平均が4を超えているかどうかを確認し、そうでない場合は何もしない場合は変数に追加されます。 。これは、特に1000行を超える場合にこれを行うための恐ろしい方法です。

2つのクエリは次のとおりです。

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

これを1つのクエリに組み合わせるにはどうすればよいですか?これを試しましたが、GROUPBYが無効に使用されています。

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
4

2 に答える 2

2

それをテストすることはできませんが、おそらくこれでうまくいくでしょう:

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は、あなたの友達です。

于 2012-04-26T20:50:57.263 に答える
1

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
于 2012-04-26T20:49:07.273 に答える