来自两列的数据按时间排序,id

时间:2013-11-23 11:55:14

标签: mysql sql

假设我们有以下两个表,为了简单起见,它们具有相同的列,但实际上它们的列会有所不同。

表1:

  • t1Id(主键,Int)
  • t1Date(Key,Datetime)

表2:

  • t2Id(主键,Int)
  • t2Date(Key,Datetime)

以下条件非常重要:

  • 多个条目可以在同一天发生,然后id是唯一可区分的因素。

到目前为止,我在单个表(表1)的情况下所做的工作如下:

SELECT * FROM table1 ORDER BY t1Date DESC, t1Id DESC,这确保了我的应用程序中的每个地方都对结果集有类似的看法。

现在进入问题,我想从多个表中提取数据。我们来看看我的查询:

(SELECT t1Id AS id, t1Date AS date FROM table1 ORDER BY t1Date DESC, t1Id DESC)
UNION
(SELECT t2Id AS id, t2Date AS date FROM table2 ORDER BY t2Date DESC, t2Id DESC)
ORDER BY date

假设在完全相同的日期每个表中有2个条目,按以下顺序插入:

1)在表1中:(10002013-11-23 09:00:00

2)在表2中:(30002013-11-23 09:00:00

3)在表1中:(10012013-11-23 09:00:00

4)在表2中:(30012013-11-23 09:00:00

有没有办法按照插入的特定顺序检索结果?

(免责声明:我没有在实践中使用这些语句,因此可能存在一些语法错误。当然,大多数操作都会在不同时间发生,但棘手的部分是在多个操作完全同时发生的时候)

1 个答案:

答案 0 :(得分:1)

SQL数据库不会自动跟踪您插入数据的顺序。

如果您想按照插入的顺序获取数据,则必须以某种方式跟踪插入的顺序。有两种方法可以做到这一点:仅为此目的使用额外的列,或使用“global id”作为表的id列。

我会在这里采用第1号方法。

因此,您将向两个表中添加列,它们将如下所示:

表1:

  • t1Id(主键,Int)
  • t1Date(Key,Datetime)
  • t1globalId(Int)

表2:

* t2Id (Primary Key, Int)
* t2Date (Key, Datetime)
* t2globalId (Int)

您的查询将是:

(SELECT t1Id AS id, t1Date AS date, t1globalId as globalId FROM table1 )
UNION
(SELECT t2Id AS id, t2Date AS date, t2globalId as globalId FROM table2)
ORDER BY globalId

许多数据库提供称为序列的功能,可用于生成一系列数字。 Mysql没有该功能,但有几种可能的方法来生成升序数字。我要尝试的第一件事是从应用程序层执行它(详细信息取决于您在应用程序中使用的语言)。您还可以编写一个触发器,在特殊的“序列表”中生成一行,读取生成的id,然后将其用作globalId。