【问题标题】:Join multiple tables (Special condition)连接多个表(特殊情况)
【发布时间】:2023-03-28 18:05:01
【问题描述】:

我试图想出一个逻辑来实现这个mysql 查询,但我想不出任何东西或在互联网上找到任何东西。我的任务是Join 两个或多个表并返回它的匹配字段。但是,如果有两个表上匹配行的三个表也必须显示。假设我有这 3 张桌子,

Table1-
num |info
----------
1   |aaaaa  
2   |bbbb
3   |ccc
4   |dddd
4   |dddd
5   |eeee

Table2-
num |info
----------
2   |bbbb
3   |ccc
4   |dddd
5   |eeee

Table3-
num |info
----------
1   |aaaaa
2   |bbbb
6   |ffff
7   |gggg

我想将这三个表连接起来,得到如下结果,

Result-
num |info   num |info   num |info
----------- ----------- ----------
1   |aaaaa  NULL|NULL   1   |aaaaa
2   |bbbb   2   |bbbb   2   |bbbb
3   |ccc    3   |ccc    NULL|NULL
4   |dddd   4   |dddd   NULL|NULL
4   |dddd   4   |dddd   NULL|NULL
5   |eeee   5   |eeee   NULL|NULL

我有这个查询,它只显示在所有三个表上。

   SELECT a . * , b. * , c . *
   FROM tbl_1 a
   JOIN tbl_2 b ON a.num = b.num
   JOIN tbl_3 c ON a.num = c.num
   ORDER BY a.num, b.num

但我想要的是即使值出现在两个表中也能显示。

非常感谢。如果在此之前解决了这个问题,这将有助于为我指明正确的方向:) 再次感谢

表结构更新

Table1-
num |info
----------
1   |aaaaa  
2   |bbbb
3   |ccc
3   |ccc
4   |dddd

Table2-
num |info
----------
1   |aaaaa
3   |ccc
4   |dddd
5   |eeee
6   |ffff

Table3-
num |info
----------
1   |aaaaa
6   |ffff
2   |bbbb

在这样的场景中,记录 6 |ffff 不会显示,

期望的输出更新

我想要得到的结果是,

Result-
num |info   num |info   num |info
----------- ----------- ----------
1   |aaaaa  1   |aaaaa  1   |aaaaa
2   |bbbb   NULL|NULL   2   |bbbb
3   |ccc    3   |ccc    NULL|NULL
3   |ccc    3   |ccc    NULL|NULL
4   |dddd   4   |dddd   NULL|NULL
NULL|NULL   6   |ffff   6   |ffff

【问题讨论】:

  • 您只想显示table1 中num 包含在table2 或table3 上的记录吗?
  • @JohnWoo 谢谢你的回复..如果可能的话,我需要考虑每张桌子:)
  • 在下面查看我的答案,它基于您的示例和期望的结果
  • @Hasitha 所以请更正您想要的结果或选择,因为您想要的结果包含 2 列,而您的选择将输出 6 列。你的问题不清楚
  • @SirRufo 很抱歉我会编辑我的问题

标签: mysql join


【解决方案1】:
SELECT  a.*
FROM    table1 a
        INNER JOIN
        (
            SELECT num, info FROM table2
            UNION
            SELECT num, info FROM table3
        ) b ON a.num = b.NUM

SQLFiddle Demo

更新 1

SELECT  a.num numA, a.info infoA,
        b.num numB, b.info infoB,
        c.num numC, c.info infoC
FROM    table1 a
        LEFT JOIN table2 b
           ON a.num = b.num
        LEFT JOIN table3 c
           ON a.num = c.num
ORDER BY a.num

SQLFiddle Demo

【讨论】:

  • 嘿,这就是我要找的...... :) 非常感谢......如果你可以,我可以知道如何显示所有三个表中的数据,比如a.* b.* c* 好吗? :) 我尝试将别名添加到其他表为b and c 并尝试显示但它没有工作:(
  • 因为c 不存在。你能更新你想要的结果吗?看起来很混乱:D
  • 哇,伙计...我不认为这是可能的。我对此有点陌生..非常感谢:)
  • 嗯有一个小问题.. 它不适用于这个 senario,我在问题中更新
  • @Hasitha 如果您能够发布具有所有条件的场景并从中获得所需的结果。删除 Table2 中的最后一行,每个人都可以看到,结果中的最后一行也应该消失(据我了解您的问题)
【解决方案2】:
SELECT a . * , b. * , c . *
  FROM tbl_1 a
  LEFT JOIN tbl_2 b ON a.num = b.num
  LEFT JOIN tbl_3 c ON a.num = c.num
  ORDER BY a.num, b.num

【讨论】:

  • 嗨,非常感谢您的回复,但这仅解决了部分问题..它连接了表中可用的行数。如果表 1 要包含比其他表更少的行结果只会显示表 1 包含的记录数.. :( 任何解决方法?在任何表中显示匹配的记录??
  • @Hasitha 那么你到底想做什么?为什么6 nd 7 没有显示在您想要的结果中?
  • @JohnWoo 我正在尝试关联数据 :) 所以我需要考虑出现在至少 2 个表中的数据 :) 这就是为什么我需要这种方法,最后我需要所有相关的数据结果是字段:)
  • @Hasitha 我认为你将冗余信息存储在多个表中。
  • 嗯...这些表是预先生成的,在这种情况下可以重复数据..:)
【解决方案3】:

@Andreas Wederbrand 解决了这个问题,

Full join for 3 tables

实现full join 是我查询的解决方案。

希望对遇到此问题的人有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2021-04-04
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多