我有两个表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
这可以用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
第一部分是一个简单的联合查询,但是您说如果两个表都有给定日期的数据,则要统一行。这将在日期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;
组的组是将行与同一日期组合到一行中,即使两个联合表都有相同日期的行。
,但我们希望此组合的行在每列中具有非NULL值。在给定日期的两行组中,一行将具有非零值,另一行将具有空值。max()忽略null,并占据其他值。Min()也可以奏效,因为它是从一组正好的1行中选择的,但是我任意选择使用max()。