我有 3 个表 - domains, keywords, comments
表 domains
是“主要”表,所有这些表都有公共(public)字段 domain_id
。如果它们在其他(keywords
和 comments
)表中没有匹配的记录,我需要编写一个从 domains
表中选择记录的查询。
我编写一个选择匹配记录的查询没有问题,但是如何实现相反的结果呢?看着How to do LEFT JOIN with more than 2 tables?我写了一个查询:
SELECT * FROM domains
LEFT JOIN keywords ON domains.domain_id=keywords.domain_id WHERE keywords.domain_id IS NULL
LEFT JOIN comments ON domains.domain_id=comments.domain_id WHERE comments.domain_id IS NULL
部分有效。它选择在 keywords
表中没有匹配项的记录,但忽略 comments
表。所以,根据我找到的其他主题,写了这个:
SELECT * FROM
(domains LEFT JOIN keywords ON domains.domain_id=keywords.domain_id WHERE keywords.domain_id IS NULL)
LEFT JOIN comments ON domains.domain_id=comments.domain_id WHERE comments.domain_id IS NULL
这个根本不起作用(语法错误)。如何修改查询以完成工作?我想第一个查询应该差不多没问题了......
最佳答案
将 where
子句放在 all join 之后,如下所示
如果你想选择 domains
这两个表 keywords
和 comments
中都不存在,那么使用 OR
WHERE
子句中的条件
SELECT * FROM domains
LEFT JOIN keywords ON domains.domain_id=keywords.domain_id
LEFT JOIN comments ON domains.domain_id=comments.domain_id
WHERE keywords.domain_id IS NULL
OR comments.domain_id IS NULL
如果要选择 domains
表 keywords
和 comments
中都不存在的,只需替换 OR
WHERE
子句中的条件 AND
如下所示
SELECT * FROM domains
LEFT JOIN keywords ON domains.domain_id=keywords.domain_id
LEFT JOIN comments ON domains.domain_id=comments.domain_id
WHERE keywords.domain_id IS NULL
AND comments.domain_id IS NULL
关于mysql - 当 2 个表上不存在匹配记录时,SQL 连接 3 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41611101/