如何过滤此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;