如何过滤此MySQL查询以仅包含未被特定用户评级的项目?

时间:2010-08-02 01:14:36

标签: sql mysql aggregate-functions

鉴于此样本数据集:

item
----
item_id  item_name  item_added
1        Apple      <date_time>
2        Banana     <date_time>

user
----
user_id  user_name
1        Alice
2        Bob
3        Carol

rating
------
rating_id  item_id  user_id  rating_value
1          1        1        3
2          1        2        4
3          1        3        5
4          2        1        5
5          2        2        2

我有这个查询来确定哪些项目只缺少一个评级:

SELECT item.*,
       COUNT(rating_value) AS rating_count
  FROM item
LEFT JOIN rating ON item.item_id = rating.item_id
 GROUP BY item_id
   HAVING rating_count = 2
 ORDER BY item_name

如何修改此查询以显示仅缺少Carol评级的项目? rating_count行不是必需的。唯一必要的列是item_id和item_name。

谢谢。

2 个答案:

答案 0 :(得分:4)

Select ...
From item 
    Left Join rating 
        On rating.item_id = item.item_id
            And rating.user_id = 3
Where rating.rating_id Is Null
Order By item.item_name 

如果您仍想要评分数据,请参阅另一种表格:

Select ...
From item 
    Left Join rating 
        On rating.item_id = item.item_id
Where Not Exists    (
                    Select 1
                    From rating As R1
                    Where R1.item_id = item.item_id
                        And R1.user_id = 3
                    )
Order By item.item_name 

答案 1 :(得分:1)

这将输出仅缺少Carol评级的项目(user_id = 3需要作为参数传递):

SELECT item.*, COUNT(rating.rating_value) AS rating_count 
 FROM item INNER JOIN rating ON item.item_id = rating.item_id AND 
      (3 NOT IN (SELECT r.user_id FROM rating AS r 
          WHERE r.item_id = rating.item_id))
 GROUP BY item_id
 HAVING rating_count = 2   /* (2 = number of users - 1) */
 ORDER BY item_name;

你必须用item替换所有movie,但你的查询混合了项目和电影,而表格是项目,所以我用项目进行了查询,我只是在查询中看到电影太晚了。