如何过滤此MySQL查询,使其仅包含未由特定用户分级的项目?

如何过滤此MySQL查询,使其仅包含未由特定用户分级的项目?,sql,mysql,aggregate-functions,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

给定此示例数据集:

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
如何修改此查询以显示仅缺少Carol评级的项目?评级计数行不是必需的。唯一必需的列是item_id和item_name

多谢各位

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 

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


您必须用
movie
替换所有
item
,但您的查询混合了item和movie,并且表是item,因此我使用item进行了查询,但我在查询中看到的电影太晚了。

movie表与item表的关系如何?抱歉,已修复。所有对“movie”的引用都应该是对“item”的引用。请理解上面第一个查询的关键是它使用了一个左外连接。许多编码人员难以记住连接类型。第一个查询很好,但我认为第二个查询无法计算评分,因为当Carol未对项目评分时,
不存在
将为真(OK)而且当
R1.item\u id item.item\u id
时,它将返回额外的行,这些行将被添加到计数中……并且第一次和第二次查询都将列出所有未由Carol评级的项目,OP希望该项目仅由CarolThomas评级:谢谢您的回复。虽然这不是我想要的,但它教会了我一些新的技巧。太棒了!非常感谢你的帮助。
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 
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;