首页 > 解决方案 > 如何按时间顺序从两个或多个表中进行选择?

问题描述

我正在尝试从两个大日志表中进行选择,并按时间顺序排列所有活动的结果。

假设我有:

Table: MyDb.Building_A
+---------------------+--------------+
| DateTime            | Employee     | (some other columns)
+---------------------+--------------+
| 2019-01-01 08:00:00 | Bob          |
(... millions more rows)

And then another table: MyDb.Building_B
+---------------------+--------------+
| DateTime            | Employee     | (some other columns)
+---------------------+--------------+
| 2019-01-01 08:10:00 | Bob          |
| 2019-01-01 08:20:00 | Peter        |
(... many millions more rows)

现在我的老板想查看一段时间内所有建筑物的所有访问日志(分页数据):

我有点需要数据像拉链一样组合在一起:

+---------------------+--------------+
| 2019-01-01 08:00:00 | Bob          |
| 2019-01-01 08:10:00 | Bob          |
| 2019-01-01 08:20:00 | Peter        |

我能想到的最好的方法是从两个表中单独选择一个数组(按日期时间排序),用两组数据对数组进行排序(使用多维数组排序),然后将数组修剪为单页数据。(想想这个我就累了!)

这里效率低下...有更好的方法吗?(使用 MySQL)

标签: mysqlselect

解决方案


您可以只使用一个UNION查询(在本例中,获取今年的所有访问):

(SELECT `DateTime`, Employee 
 FROM MyDb.Building_A
 WHERE `DateTime` BETWEEN '2019-01-01' AND '2019-12-31')
UNION
(SELECT `DateTime`, Employee 
 FROM MyDb.Building_B
 WHERE `DateTime` BETWEEN '2019-01-01' AND '2019-12-31')
ORDER BY `DateTime`

UNION将从每个表中获取符合DateTime条件的所有行,ORDER BY并将所有行按 排序DateTime,并根据需要混合建筑物 A 和 B。

注意我假设您的DateTime列是 MySQLDateDateTime数据类型。如果不是,您可能需要使用STR_TO_DATE它来转换它以使BETWEEN逻辑工作。


推荐阅读