我有两个表internal_mail
和external_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
答案 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()。