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

标签 mysql sql

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

表 1:

  • t1Id(主键,整数)
  • t1Date(关键字,日期时间)

表 2:

  • t2Id(主键,整数)
  • t2Date(关键,日期时间)

下面的条件很重要:

  • 多个条目可以出现在同一日期,则 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中:(1000, 2013-11-23 09:00:00)

2) 表2中:(3000, 2013-11-23 09:00:00)

3) 表1中:(1001, 2013-11-23 09:00:00)

4) 表2中:(3001, 2013-11-23 09:00:00)

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

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

最佳答案

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

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

我将在这里采用方法 1。

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

表 1:

  • t1Id(主键,整数)
  • t1Date(关键字,日期时间)
  • t1globalId(整数)

表 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。

关于mysql - 来自按时间排序的两列的数据,id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20161982/

相关文章:

php - 使用 Yii2 在 Gridview 中显示相关数据

php - 获取选定列的正则表达式

php - mysql插入错误检查

mysql - 将字符串转换为时间sql或雪花

sql - Oracle SQL (Oracle 11g) 中的排名优于分区依据

mysql - 从 MySQL 的表中选择前 3 个值

javascript - 使用FineUploader上传带索引的多个文件

mysql - 在两个 td 标签中显示日期时间

mysql - 如何比较 MySQL 中同一字段的两个不同值?

MySQL 查询截断所有表而忽略所有约束?