2011-01-26 75 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 2011-01-26 20:03:21

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价值 - 只是尝试一下,看看你会得到什么。