使用MySQL 5.x我希望有效选择表X中的所有行,其中表Y中的无相关行满足某些条件,例如
在X中给我所有记录,其中与foo = bar相关的Y不存在
SELECT count(id) FROM X
LEFT OUTER JOIN Y ON y.X_id = X.id AND y.foo = 'bar'
WHERE y....?
据我了解,左外连接保证为左(第一)表中的每一行产生一行 - 在这种情况下为X - 是否找到了连接表中令人满意的行。我想要做的只是选择那些没有找到行的行。
在我看来,如果没有匹配的记录,y.X_id应为NULL,但此测试似乎不起作用。 y.X_id = 0或!y.X_id也不是。
编辑:纠正了多个回复指出的转录错误(非AS)。修正了语法错误。
答案 0 :(得分:19)
SELECT count(id) FROM X
LEFT OUTER JOIN Y ON (y.X_id = X.id AND y.foo = 'bar')
WHERE y.X_id is null
你很亲密。
首先按正常方式进行连接,然后选择Y中not null
行实际为null
的所有行,这样您就可以确定“不匹配”,而不仅仅是{{ 1}} Y中的值。
另请注意您在查询中输入的拼写错误(已更正):
null
答案 1 :(得分:4)
检查表Y的主键是否为NULL将执行该操作,这表示连接未匹配:
SELECT count(id) FROM X
LEFT OUTER JOIN Y ON (y.X_id = X.id AND y.foo = 'bar')
WHERE y.Y_id is null
答案 2 :(得分:2)
约翰的回答是正确的100%。
除此之外,还有这个选项:
SELECT count(id)
FROM X
WHERE NOT EXISTS
( SELECT *
FROM Y
WHERE (y.X_id = X.id AND y.foo = 'bar')
)
根据您的表格大小和数据分布,这可能更有效。测试并保持两种方式以供将来参考。
答案 3 :(得分:-1)
为什么要使用外连接? 你不能这样做:
SELECT count(id)
FROM X JOIN Y AS y.X_id = X.id AND y.foo <> 'bar'
答案 4 :(得分:-1)
你必须记住 NULL 是特殊值!这就是我mysql doc的原因你有一章名为“4.3.4.6使用NULL值”。
链接:强> https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html
享受!