查询两个具有不同列但只有一个但没有关系的表

时间:2017-12-08 15:11:52

标签: mysql sql

我有两个表internal_mailexternal_mail,它们相对有不同的列。我尝试从两个表中选择所有记录,并按日期列排序,在两个表中都称为date_of_arrival

例如,这是internal_mail

colunm 1          colunm 2          colunm 3          date_of_arrival
some_record       some_record       some_record       2017/8/12
.....             .....             .....             ..... 
.....             .....             .....             ..... 
.....             .....             .....             ..... 
.....             .....             .....             ..... 

这是external_mail

colunm A          colunm B          colunm C          date_of_arrival
another_record    another_record    another_record       2017/7/12
.....             .....             .....             ..... 
.....             .....             .....             ..... 
.....             .....             .....             ..... 
.....             .....             .....             ..... 

我在这里尝试实现的是这样的事情(如果是降序的话):

colunm 1  colunm 2  colunm 3  column A  column B  column C   date_of_arrival
s_r       s_r       s_r       empty     empty     empty      2017/8/12
empty     empty     empty     a_r       a_r       a_r        2017/7/12
s_r       s_r       s_r       empty     empty     empty      2017/8/12
empty     empty     empty     a_r       a_r       a_r        2017/7/12

2 个答案:

答案 0 :(得分:2)

可以使用full join完成此操作。由于MySQL不支持,union all是您的最佳选择。假设您必须在两个表中的日期匹配时显示一行上的记录,您必须按date_of_arrival进行聚合。如果不是这种情况,请省略聚合,只使用内部查询。

select max(column_1),max(column_2),max(column_3),max(columnA),max(columnB),max(columnC),date_of_arrival
from (select column_1,column_2,column_3,
      null as columnA,null as columnB,null as columnC,date_of_arrival
      from internal_email
      union all
      select null,null,null,columnA,columnB,columnC,date_of_arrival
      from external_email
     ) t
group by date_of_arrival

答案 1 :(得分:1)

第一部分是一个简单的UNION查询,但是如果两个表都有给定日期的数据,则表示要统一行。这将在FULL OUTER JOIN日期实现,但MySQL不支持FULL OUTER JOIN

所以这是一个变通方法的示例(未经测试):

SELECT 
  MAX(column1) AS column1,
  MAX(column2) AS column2,
  MAX(column3) AS column3,
  MAX(columnA) AS columnA,
  MAX(columnB) AS columnB,
  MAX(columnC) AS columnC,
  date_of_arrival
FROM (
    (SELECT column1, column2, column3, 
       NULL AS columnA, NULL AS columnB, NULL AS columnC,
       date_of_arrival
     FROM internal_mail)
    UNION ALL
    (SELECT NULL, NULL, NULL, columnA, columnB, columnC, 
       date_of_arrival
     FROM external_mail)
) AS t
GROUP BY date_of_arrival;

GROUP BY是将具有相同日期的行组合成一行,即使两个联合表都有一个具有相同日期的行。

但是我们希望这个组合行在每列中都有非空值。在给定日期的两行组中,一行将具有非空值,另一行将具有空值。 MAX()忽略null,并取另一个值。 MIN()也可以正常工作,因为它选择了一行正好1行,但我随意选择使用MAX()。