【问题标题】:MySQL Union on Dissimilar Fields without Dummy Columns没有虚拟列的不同字段上的 MySQL 联合
【发布时间】:2012-05-01 13:41:57
【问题描述】:

假设我有 2 个或更多由不同列组成的表,其中不一定存在共享键 (id):

Alpha:  
+----+-------+-------+-------+
| id | paula | randy | simon |
+----+-------+-------+-------+
|  1 |     8 |     7 |     2 |
|  2 |     9 |     6 |     2 |
|  3 |    10 |     5 |     2 |
+----+-------+-------+-------+

Beta:
+----+---------+-----+------------+------+
| id | is_nice | sex |        dob | gift |
+----+---------+-----+------------+------+
|  2 |       1 |   F | 1990-05-25 | iPod |
|  3 |       0 |   M | 1990-05-25 | coal |
+----+---------+-----+------------+------+

Gamma:
+----+---------+--------+
| id | is_tall | is_fat |
+----+---------+--------+
|  1 |       1 |      1 |
| 99 |       0 |      1 |
+----+---------+--------+

想要的效果是在 id 插入 NULL 数据不可用时将表混合在一起:

+----+-------+-------+-------+---------+-----+------------+------+---------+--------+
| id | paula | randy | simon | is_nice | sex |        dob | gift | is_tall | is_fat |
+----+-------+-------+-------+---------+-----+------------+------+---------+--------+
|  1 |     8 |     7 |     2 |         |     |            |      |       1 |      1 |
|  2 |     9 |     6 |     2 |       1 |   F | 1990-05-25 | iPod |         |        |
|  3 |    10 |     5 |     2 |       0 |   M | 1990-05-25 | coal |       1 |      1 |
| 99 |       |       |       |         |     |            |      |       0 |      0 |
+----+-------+-------+-------+---------+-----+------------+------+---------+--------+

我可以使用 NULL 'dummy' 列和 UNION (MySql SELECT union for different columns?),但如果表的数量很大,这似乎是一种皇家痛苦。我想有一种 JOIN 方法可以用来完成此操作,但我需要一些帮助来解决此问题。

这行得通:

SELECT `id`, `paula`, `randy`, ..., NULL AS `is_nice`, ... FROM `Alpha`
UNION SELECT `id`, NULL AS `paula`, ..., FROM `Beta`
UNION SELECT `id`, NULL AS `paula`, ..., `is_fat` FROM `Gamma` ;

但它确实感觉像错误的方式来做到这一点。每当我想添加其他表时,我如何才能获得相同的结果,而不必编辑插入 NULL AS whatever 的 SQL 行和行?

提前致谢!

【问题讨论】:

  • 实际上,您的查询不会那样工作。您将在结果中得到 7 行。

标签: mysql join field union


【解决方案1】:

你想使用LEFT JOINs。

http://dev.mysql.com/doc/refman/5.0/en/join.html

在你的例子中:

SELECT id_t.id, a.paula, a.randy, a.simon, b.is_nice, b.sex, b.dob, b.gift, g.is_tall, g.is_fat
FROM (SELECT DISTINCT id FROM alpha,beta,gamma) as id_t
LEFT JOIN alpha a ON a.id = id_t.id
LEFT JOIN beta b on b.id = id_t.id
LEFT JOIN gamma g on g.id = id_t.id

【讨论】:

  • 好的,但看起来 ypercube 可能是第一个。
【解决方案2】:
SELECT
    allid.id
  , a.paula, a.randy a.simon
  , b. ...
  , c. ... 
FROM
        ( SELECT id
          FROM Alpha
        UNION 
          SELECT id
          FROM Beta
        UNION 
          SELECT id
          FROM Gamma 
        ) AS allid
    LEFT JOIN
        Alpha AS a
            ON a.id = allid.id
    LEFT JOIN
        Beta AS b
            ON b.id = allid.id
    LEFT JOIN
        Gamma AS g
            ON g.id = allid.id

如果表格除了id 之外没有其他列,您可以使用简单编写(但更容易破解):

SELECT 
    *
FROM
        ( SELECT id
          FROM Alpha
        UNION 
          SELECT id
          FROM Beta
        UNION 
          SELECT id
          FROM Gamma 
        ) AS allid
    NATURAL LEFT JOIN
        Alpha
    NATURAL LEFT JOIN
        Beta 
    NATURAL LEFT JOIN
        Gamma 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多