【问题标题】:MySQL - JOIN a OR bMySQL - 加入 a 或 b
【发布时间】:2018-10-01 08:39:03
【问题描述】:

假设我有一个TABLE a,其中COLUMN data 是要加入 用于其他2 个表(TABLE bTABLE c)的,因为我想得到一个@ 987654325@ 在bc
问题是 a.dataonlyb.data 匹配 或仅c.data 匹配。

  • 如何根据a获取b.infoc.info


我尝试了多远:

在多次尝试明显错误的语法之后,我做的最好的是在 2 个查询中:

SELECT b.info FROM a INNER JOIN b ON a.data = b.data
SELECT c.info FROM a INNER JOIN c ON a.data = c.data

我想实现如下所示:

SELECT alias.info FROM a INNER JOIN (b OR c) AS alias ON a.data = alias.data


我为什么要这样做

实际上我可以得到我想要的数据并使用 PHP 来处理它。但是我正在做一个巨大的过程(与我的问题无关)而不是一个好的查询,并且页面需要太多时间来加载。

【问题讨论】:

  • 使用 UNION 或 LEFT JOIN

标签: mysql sql join conditional-statements


【解决方案1】:

试试这样的:

SELECT IFNULL(b.info,c.info) AS info
FROM a
    LEFT JOIN b ON a.data = b.data
    LEFT JOIN c ON a.data = c.data

【讨论】:

    【解决方案2】:

    您可以左连接到bc 表,然后使用info 字段不是NULL

    select coalesce(b.info, c.info) info
    from a
      left join b on a.data = b.data
      left join c on a.data = c.data
    

    【讨论】:

    • 阅读this question 的答案我会使用你的答案,因为我没有在我的问题中提到TABLE d。 +1 解释您的答案,非常感谢!
    【解决方案3】:

    如果data 保证在表bc 中是唯一的

    我们可以使用外连接尝试从每个表中获取匹配的行,然后在SELECT列表中使用表达式来测试我们是否得到了匹配的行。例如:

    SELECT a.data
         , IF(b.data IS NULL,IF(c.data IS NULL,NULL,'c'),'b') AS info_src
         , IF(b.data IS NULL,c.info,b.info) AS b_or_c_info
      FROM a
      LEFT
      JOIN b 
        ON b.data = a.data
      LEFT
      JOIN c
        ON c.data = a.data
    

    如果我们在b 中找到匹配行,则b.data 保证为非NULL。我们知道该值不是 NULL,因为它满足相等 (=) 比较。

    请注意,IF 是 MySQL 特定的语法。更便携的符合 ANSI 标准的版本

           CASE
             WHEN b.data IS NULL
             THEN c.info
             ELSE b.info
           END  AS b_or_c_info
    

    【讨论】:

    • 谢谢它也很好用。我知道IF 是特定于 MySQL 的,但我并不完全理解该查询。 info_src 重要吗?谢谢你的回答
    • info_src 列不是必需的。它只是结果中的一个附加列。我们经常包含一个鉴别器列,如本例中的info_src。告诉我们info 的值来自哪个行源... b、c 或两者都不是。在某些情况下,我们想知道这一点,并且包含一个鉴别器列是一种方便的方式来传达该信息如果知道b_or_c_info 来自哪个表不重要,那么info_src 列并不重要。 (我将其包含在示例中,因为在某些用例中,了解来源很重要。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2021-04-09
    • 2011-08-19
    • 1970-01-01
    • 2021-01-17
    相关资源
    最近更新 更多