我正在尝试查询多对多关系,以查看是否存在一个标记,但不存在另一个标记。我试图在一个简单的查询中做到这一点。
我问了几个朋友,检查了堆栈溢出,但似乎找不到有人试图做类似的事情。我设置了一个SQLFiddle页面,上面显示了我想要做的事情。
http://sqlfiddle.com/#!9/22b741b/8
在本例中,我有三个用户: Mike、Alice和George。
我有7块糖果:士力架,好时,银河,KitKat,里斯,特威斯勒和酸甜饼。
迈克喜欢士力架,KitKat,瑞斯和特威斯勒。
爱丽丝喜欢KitKat,Hersheys和Sour Patch。
乔治喜欢KitKat和Twizzler。
我想知道谁喜欢Twizzler而不是士力架。
这就是我到目前为止所拥有的代码。有了这个,我得到了迈克和乔治。我只想要乔治。如何修改查询以获得我想要的结果?
SELECT Users.firstname, Candy.candyname
FROM Users
INNER JOIN UsersCandy ON Users.id = UsersCandy.user_id
INNER JOIN Candy ON UsersCandy.candy_id = Candy.id
WHERE Candy.candyname = 'Twizzlers'
AND Candy.candyname != 'Snickers'
发布于 2019-06-12 03:11:12
第二个连接必须是一个LEFT JOIN
,所以您可以测试NULL
来查找不匹配的行,就像在Return row only if value doesn't exist中一样。
SELECT DISTINCT u.firstname
FROM Users AS u
JOIN UsersCandy AS uc1 ON u.id = uc1.user_id
JOIN Candy AS c1 ON uc1.candy_id = c1.id
LEFT JOIN (
SELECT u.id
FROM Users AS u
JOIN UsersCandy AS uc2 ON u.id = uc2.user_id
JOIN Candy AS c2 ON uc2.candy_id = c2.id
WHERE c2.candyname = 'Snickers'
) AS u2
ON u.id = u2.id
WHERE c1.candyname = 'Twizzlers' AND u2.id IS NULL
https://stackoverflow.com/questions/56550294
复制相似问题