MySQL ORDER BY 根据日期时间查询返回不正确的结果

Posted

技术标签:

【中文标题】MySQL ORDER BY 根据日期时间查询返回不正确的结果【英文标题】:MySQL ORDER BY returning incorrect results based on datetime query 【发布时间】:2015-10-12 22:01:29 【问题描述】:

我遇到了一些我不理解的 mysql 查询行为

我正在运行 MySQL 5.5.42

我有什么

我有一个带有列的表格:

id(整数,自动递增) party_id(int - 添加行时由后端设置) added_on(日期时间 - 添加行时由后端设置,即我不使用 ON UPDATE CURRENT_TIMESTAMP)

我想做什么

我想进行以下查询:

SELECT * FROM my_table WHERE party_id = 1 ORDER BY added_on ASC

SELECT * FROM my_table WHERE party_id IN (1,2,3...) ORDER BY added_on ASC

当added_on 日期对于相同的party_id 相同时会发生奇怪的行为(如上所述,added_on 日期由后端而不是MySQL 设置)

例如:

id = 100 party_id = 1 add_on = 2015-10-12 00:00:00

id = 101 party_id = 1 add_on = 2015-10-12 00:00:00

当我运行这个查询(SELECT * FROM my_table WHERE party_id = 1 ORDER BY added_on ASC)时,返回的结果的顺序是 id = 100 然后 id = 101(这是它们的顺序尽管日期相同,但仍添加)。

当我运行这个查询 (SELECT * FROM my_table WHERE IN (1,2,3,4,5) ORDER BY added_on ASC) 时,返回的结果按 added_on 和 where added_on 的顺序排列是一样的,那么最低的 id (100) 同上。

我的问题

当我使用 WHERE party_id IN (1,2,3,4,5...89)(89 或以上)运行查询时,返回的结果按 added_on 的顺序排列,但在哪里added_on 是相同的,结果是相反的——所以在上面的例子中,party_id 为 1,结果返回 id = 101 然后 id = 100

请注意,它不需要是 id = 89 它只需要是我在“party_id IN (...)”中查询的 89+ 个 ID

我测试过的内容

我认为这可能是一个微时间问题,但两次都给我 .000000 作为微时间加上 - 正如我上面所说 - 我在插入行时使用相同的 added_on 日期,所以它们应该完全相同。

我也在 phpMyAdmin 中手动检查了这些查询并得到相同的结果。我原本以为是我使用的后端代码或框架有问题,但似乎不是。

对我哪里出错有任何想法吗?

【问题讨论】:

“我哪里出错了有什么想法吗?” – 你错误地期望数据以某种原因排序,而不告诉数据库按顺序排序那个具体的标准。由于您没有告诉数据库您希望同一 added_on 日期的 id 的顺序是什么,因此您不能期望它们以任何特定方式排序。如果您按照插入某些查询/选择的顺序获取它们,那纯属巧合。如果您想要订购它们,您需要告诉数据库为您订购它们。 好的,谢谢。我没有意识到这是一个巧合。感谢您的评论。 【参考方案1】:

尝试只添加二阶列id:

SELECT * 
FROM my_table 
WHERE party_id IN (1,2,3,89) 
ORDER BY added_on ASC, id ASC

【讨论】:

你不是 ORDER BY added_on 你只是 ORDER BY id ASc。所以 id 是 AUTOINC 这意味着更高的数字是稍后的时间

以上是关于MySQL ORDER BY 根据日期时间查询返回不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

mysql 多表 查询 之后 group by 分组 order by 无法按照日期排序

在 mysql 中使用 union 和 order by 子句

mysql - ORDER BY 语句中的 IF...ELSE 或 CASE

时间戳字段上的 ORDER BY 使我的查询变慢。如何优化它?

UserGroup by & order by 过滤 MySQL 查询

mysql order by 自定义