MySQL多次加入和排除

时间:2011-11-29 11:24:37

标签: mysql join

我正在努力加入3张桌子,我正在尝试加入并排除某些结果。 基本上它与mysql join where not exists几乎相同,但我仍然无法弄清楚如何成功组合多个表。

目标是从表A中选择结果,其中中间表B 中的行为空 OR 其中表C(链接到B,但不是A) )特定值不匹配。

类似的东西:

SELECT      x 
FROM        tablea
LEFT JOIN   tableb
ON          tablea.x = tableb.x
LEFT JOIN   tablec
ON          tableb.y = tablec.y
WHERE       tableb.x IS NULL
OR          tablec.z != 'excluded'

但它不起作用。 我还想避免像使用NOT IN或NOT EXISTS这样的子查询以加快速度...任何建议?

编辑:尽管我之前说过,它应该有效。只需记住在合并多个连接时仔细检查正确的大括号,嵌套和'where'子句位置

2 个答案:

答案 0 :(得分:1)

这应该通过一个查询来完成,并且速度相当快。 :)

SELECT x 
FROM tablea
    LEFT JOIN tableb ON tablea.x = tableb.x
    LEFT JOIN tablec ON tableb.y = tablec.y AND tablec.z != 'excluded'
WHERE
    tableb.x IS NULL
    OR tablec.y IS NOT NULL

这是假设您不介意从tablea获取行,其中tableb.x为null且tablec.y为null,或者它们都不是。如果只想要tablea中的行,其中tableb.x或tablec.y包含值,则需要将OR更改为XOR。

答案 1 :(得分:0)

这实际上是两个单独的查询,因此请使用UNION

SELECT tablea.*
FROM tablea
LEFT JOIN tableb ON tablea.x = tableb.x
WHERE tableb.x IS NULL
UNION
SELECT tablea.*
FROM tablea
LEFT JOIN tablec ON tableb.y = tablec.y AND tablec.z != 'excluded'

P.S。如果不使用那种疯狂的“表名对齐”样式格式化SQL,那么你的生活会更容易。在许多年编写SQL之后,我发现这是最容易阅读的