1

問題

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
4

3 に答える 3

1

あなたが何をhub_id表しているのかわかりませんが、必要だと思います。また、Posts のキー フィールドが isposts.post_idであり、notであると仮定しposts.idます。

SELECT   `p`.`id`, avg(`pr`.`review`) AS `average`
FROM     `posts`        AS `p`
JOIN     `post_reviews` AS `pr` ON (`p`.`id`=`pr`.`post_id`)
WHERE    `hub_id` =:hub_id
     AND `p`.`date` BETWEEN CURRENT_DATE-3 AND CURRENT_DATE
GROUP BY `p`.`id`
ORDER BY avg(`review`) DESC;

例を参照してください: sqlfiddle

于 2013-08-09T23:12:39.607 に答える
0

これは、それを証明するために sqlfiddle で動作するクエリです。

SELECT 
  p.hub_id
 ,p.post_id
 ,p.article
 ,p.articleMeta
 ,p.date
 ,IFNULL(AVG(r.ratings), 0) averageRating
FROM posts p
  LEFT JOIN post_reviews r ON
    r.post_id = p.post_id
WHERE 
    hub_id = 1 
  AND date >= CURDATE() - 3
  AND date <= CURDATE()
GROUP BY 
  p.hub_id
 ,p.post_id
 ,p.article
 ,p.articleMeta
 ,p.date
ORDER BY
  p.date DESC
 ,averageRating DESC

http://sqlfiddle.com/#!2/39315/1

于 2013-08-09T23:29:44.360 に答える