問題
posts
記事と記事のメタを含む1 つのテーブル ( ) があります。
別の表 ( post_reviews
) には、各記事のユーザーが投稿した評価 (5 段階の値) が含まれており、問題の投稿posts
の で参照されています。id
過去 3 日間のレビューによる上位 3 件の投稿を見つけようとしています。したがって、私はする必要があります:
- その期間 (3 日間) のすべての投稿を検索する
- 各投稿の平均評価を見つける
- 平均評価(降順)で並べ替えます
コード
最初の部分では、クエリを正常に使用できます。
SELECT * FROM `posts` WHERE `hub_id`=:hub_id AND `date`>=:start_date AND `date`<=:end_date)
個々の投稿の平均評価を見つけるには、次のクエリを使用します。
SELECT SUM(`review`) AS `total` FROM `post_reviews` WHERE `id`=:id
次に、これから行数を取得して平均を計算します。
SELECT * FROM `post_reviews` WHERE `post_id`=:id
これら 3 つをどのように組み合わせるか、またはこのデータを処理して、期間内の投稿を平均評価で並べ替えるにはどうすればよいですか?
答え
最終結果は次のようになります。
SELECT `posts`.`id`, avg(`post_reviews`.`review`) as `average`
FROM `posts`
JOIN `post_reviews` ON (`posts`.`id`=`post_reviews`.`post_id`)
WHERE `hub_id`=:hub_id
AND `posts`.`date`>=:start_date
AND `posts`.`date`<=:end_date
GROUP BY `post_id`
ORDER BY avg(`review`) desc