【问题标题】:MySQL multiple join and excludeMySQL 多重连接和排除
【发布时间】:2012-01-08 17:50:15
【问题描述】:

我正在尝试加入 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”子句的位置

【问题讨论】:

    标签: mysql join


    【解决方案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 的行,或者它们都不为 null。如果您只想要 tablea 中 tableb.x OR tablec.y 包含值的行,则需要将 OR 更改为 XOR。

    【讨论】:

    • 非常感谢!总的来说,我终于设法通过编辑另一个先前连接的语法来使我的查询工作(因为与目的无关,所以省略了)......好吧,我必须更加注意嵌套连接并始终将每个'where' 子句结尾。无论如何,您提供的技巧非常宝贵,特别是关于 OR & XOR,毕竟它证实了我的查询还不错:)
    【解决方案2】:

    这实际上是两个独立的查询,所以使用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'
    

    附言如果你不用那种疯狂的“表名对齐”风格来格式化你的 SQL,你的生活会更轻松。在许多年编写 SQL 之后,我发现这是最容易阅读的

    【讨论】:

    • 谢谢,我会记住您的建议。有时在 PHP 脚本中我发现对齐很有用,这就是为什么我粘贴了如此“疯狂”的代码......我很抱歉 :)
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多