【问题标题】:MySQL select from multiple tables, keep all columns and row without matchMySQL从多个表中选择,保留所有列和行不匹配
【发布时间】:2022-11-15 16:30:57
【问题描述】:

我有2张桌子

tableA:

id dateA colA ...
1 2022-11-11 12:00:00 A
2 2022-11-12 12:00:00 B
3 2022-11-14 12:00:00 C

tableB:

id dateB colB ...
3 2022-11-05 12:00:00 D
4 2022-11-06 12:00:00 E
5 2022-11-13 12:00:00 F

我想将所有行放在一个结果中并按列排序 date

想要的结果(两个表中的行按列排序 date DESC):

id date colA colB ... ...
3 2022-11-14 12:00:00 C
5 2022-11-13 12:00:00 F
2 2022-11-12 12:00:00 B
1 2022-11-11 12:00:00 A
4 2022-11-06 12:00:00 E
3 2022-11-05 12:00:00 D

我可以组合表格,但表格被“压扁”了......

SELECT 
    COALESCE(a.id, b.id) AS id, 
    COALESCE(a.dateA, b.dateB) AS date, 
    a.colA, 
    b.colB
FROM tableA AS a, tableB AS b
ORDER BY date DESC

【问题讨论】:

    标签: mysql sql mariadb sql-order-by union


    【解决方案1】:

    使用UNION ALLORDER BY。这需要枚举列:

    select id, dateA as dateX, colA, null as colB from tableA
    union all
    select id, dateB, null, colB from tableB
    order by dateX
    

    union all 结合了两个数据集。由于我们在两个表中有不同的列,我们需要安排两个 select 子句,以便它们返回相同的列集; null 值可用于填充给定数据集中的“缺失”列。

    至于结果集的排序:在 MySQL 中,UNION ALL 查询中的单个 ORDER BY 适用于整个结果集(它是联合的)。查询就是这样做的(使用 dateX,这是在子查询中创建的列别名)。

    【讨论】:

    • 哦,我现在明白了。这也是正确的吗? sql SELECT id, dateA, colA, null FROM tableA UNION ALL SELECT id, dateB, null, colB FROM tableB ORDER BY dateTime DESC 结果好像还可以,但是真的可以吗?
    • @Ondra:列别名很重要,并且必须在(第一个)selectorder by 子句之间保持一致,如我的查询中所示。
    【解决方案2】:

    如果您想将共享相同iddate 的行显示为一行,您可以在 GMB 的答案之上构建:

    select id, dateX as date, max(colA) as colA, max(colB) as colB
    from (
      select id, dateA as dateX, colA, null as colB from tableA
      union all
      select id, dateB, null, colB from tableB
    ) as q
    group by id, dateX
    order by dateX
    

    db-fiddle

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多