2011-01-26 18 views
0

私は3つのテーブルの設定(項目、レビュー、評価)を持っています。私は評価の合計数と各項目の総レビュー数を数え、それから合計数の相互作用数を結合し、相互作用に基づいて上位項目を出力したいと考えています。複数の結合でカウント

私は少し質問に苦労しています。

SELECT item.id, count(reviews.review_id) AS total_reviews, count(ratings.rating_id) AS total_ratings, total_reviews+total_ratings AS total_interactions FROM items LEFT OUTER JOIN reviews ON reviews.item_id=item.id LEFT OUTER JOIN ratings ON rating.item_id=item.id GROUP BY item.id ORDER BY total_interactions DESC LIMIT 0,1

答えて

2
SELECT *, total_reviews + total_ratings AS total_interactions 
FROM (
     SELECT id, 
       (
       SELECT COUNT(*) 
       FROM reviews 
       WHERE item_id = i.id 
       ) AS total_reviews, 
       (
       SELECT COUNT(*) 
       FROM ratings 
       WHERE item_id = i.id 
       ) AS total_ratings 
     FROM items i 
     ) q 
ORDER BY 
     total_interactions DESC 
LIMIT 1 
+0

乾杯、私は完全にオフだった! – ATLChris

0

私は、ちょうどあなたの元のクエリを修正しようとする代わりに別のものを書くのでしょう:

SELECT 
    item.id, 
    count(distinct reviews.review_id) AS total_reviews, 
    count(distinct ratings.rating_id) AS total_ratings, 
    count(distinct reviews.review_id) + count(distinct ratings.rating_id) AS total_interactions 
FROM 
    items 
    LEFT OUTER JOIN reviews ON 
     reviews.item_id = item.id 
    LEFT OUTER JOIN ratings ON 
     rating.item_id = item.id 
GROUP BY 
    item.id 
ORDER BY 
    total_interactions DESC 
LIMIT 0, 1 

ここで重要なのはCOUNT(DISTINCT field)です。ところで、ちょうどtotal_ratings値のためにそれを必要とするでしょう - ちょうどそれを試して、あなたが得るものを見てください。