查询多对多关系以查看是否存在一个值另一个不存在?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (7)

我正在尝试查询多对多关系以查看是否存在一个标签而不是另一个标签。我试图在一个简单的查询中执行此操作。

我问了几个朋友,并检查了堆栈溢出,似乎找不到想要做类似事情的人。我设置了一个SQLFiddle页面,显示了我正在尝试做的事情。

http://sqlfiddle.com/#!9/22b741b/8

在示例中,我有三个用户:Mike,Alice和George。 我有7个糖果棒:士力架,Hersheys,银河系,KitKat,Reeses,Twizzlers和Sour Patch。 Mike喜欢Snickers,KitKat,Reeses和Twizzlers。 爱丽丝喜欢KitKat,Hersheys和Sour Patch。 乔治喜欢KitKat和Twizzlers。

我想找出谁喜欢Twizzlers但不喜欢士力架。

这是我到目前为止的代码。有了这个,我得到了迈克和乔治。我只想要乔治。如何修改查询以获得我正在寻找的结果?

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'
提问于
用户回答回答于

您的查询正在candyname从同一行进行测试。如果 candy 是Twizzlers,那么它显然也不是Snickers。因此,您的查询只会找到喜欢Twizzlers的所有人。

编写一个子查询,查找喜欢Snickers的所有用户。然后将其与查找找到喜欢Twizzlers的用户的查询联系起来。第二个连接必须是a LEFT JOIN,因此您可以测试NULL以查找不匹配的行,如仅在值不存在时返回行中

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

DEMO

扫码关注云+社区

领取腾讯云代金券