我想使用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也不是。
编辑 :更正了转录错误(ON而不是AS),该错误已由多个响应指出。修复语法错误。
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
你近了。
首先,像往常一样进行连接,然后选择not null实际上在Y中存在一行的所有行null,因此可以确保存在“不匹配”,而不仅仅是nullY中的一个值。
not null
null
另请注意您在查询中所做的错别字(已更正):
LEFT OUTER JOIN Y AS -- should be LEFT OUTER JOIN Y ON -- This however is allowed LEFT OUTER JOIN table2 as Y ON ....