使用LEFT OUTER JOIN检查相关行是否存在的最佳方法是什么

pod*_*son 9 mysql sql join outer-join

使用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....?
Run Code Online (Sandbox Code Playgroud)

据我所知,左外连接保证为左(第一)表中的每一行产生一行 - 在这种情况下为X - 是否找到了连接表中令人满意的行.我想要做的只是选择那些没有找到行的行.

在我看来,如果没有匹配的记录,y.X_id应为NULL,但此测试似乎不起作用.y.X_id = 0或!y.X_id也不是.

编辑:纠正的转录错误(ON不是AS),这是由几个回答指出的.修正了语法错误.

Joh*_*ica 20

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
Run Code Online (Sandbox Code Playgroud)

你很亲密

首先按正常方式进行连接,然后选择not null实际上Y行中的所有行null,这样您就可以确定存在"不匹配"而不仅仅是nullY中的值.

另请注意您在查询中输入的拼写错误(自更正后):

LEFT OUTER JOIN Y AS
-- should be
LEFT OUTER JOIN Y ON
-- This however is allowed
LEFT OUTER JOIN table2 as Y ON ....
Run Code Online (Sandbox Code Playgroud)