Mysql 从两个表中选择并按日期时间戳排序
我有两个类似于下面的MySQL表:Mysql 从两个表中选择并按日期时间戳排序,mysql,select,union,Mysql,Select,Union,我有两个类似于下面的MySQL表: MESSAGES_IN messageID receivedDate message MESSAGES_OUT messageID sentDate message 基本上,我想从这两个表中选择消息,并按它们各自的日期排序。例如,如果数据集为: MESSAGES_IN 1 2014-04-24 12:26:33 Test message inbound 2 2014-04-24 19:12:15 Another test message inbou
MESSAGES_IN
messageID
receivedDate
message
MESSAGES_OUT
messageID
sentDate
message
基本上,我想从这两个表中选择消息,并按它们各自的日期排序。例如,如果数据集为:
MESSAGES_IN
1 2014-04-24 12:26:33 Test message inbound
2 2014-04-24 19:12:15 Another test message inbound
MESSAGES_OUT
1 2014-04-24 12:31:33 Test message outbound
2 2014-04-24 19:16:15 Another test message outbound
然后我希望输出为:
2014-04-24 12:26:33 Test message inbound
2014-04-24 12:31:33 Test message outbound
2014-04-24 19:12:15 Another test message inbound
2014-04-24 19:16:15 Another test message outbound
我已尝试下面的查询,但我得到一个错误,即我的ORDER BY是未知列:
SELECT i.receivedDate, i.message
FROM MESSAGES_IN i
UNION
SELECT sentDate, o.message
FROM MESSAGES_OUT o
ORDER BY receivedDate, sentDate;
谢谢大家! MySQL在使用
UNION
时将使用第一个查询中的列名,因此只需在orderby
子句中使用第一个查询的列名即可:
SELECT i.receivedDate, i.message
FROM MESSAGES_IN i
UNION ALL
SELECT o.sentDate, o.message
FROM MESSAGES_OUT o
ORDER BY receivedDate
通常使用这样的别名来保持列名的完整性:
SELECT i.receivedDate AS sendreceiveDate, i.message
FROM MESSAGES_IN i
UNION ALL
SELECT o.sentDate, o.message
FROM MESSAGES_OUT o
ORDER BY sendreceiveDate
此外,您可能希望
UNION ALL
以避免在结果中丢失重复的行。由于列名不同,您可以使用“ORDER BY 1”,即第一列
(SELECT i.receivedDate as messageDate, i.message
FROM MESSAGES_IN i )
UNION
( SELECT o.sentDate as messageDate, o.message
FROM MESSAGES_OUT o )
ORDER BY 1
我相信MySQL在这种情况下也可以使用别名,因此您可以用messageDate替换“1”。只需按receivedDate写入
ORDER
,而不使用sentDate
,因为是相同的列结果。您可能需要全部联合
。