MySQL 按日期排序和布尔优先级:数字到日期的怪异

Posted

技术标签:

【中文标题】MySQL 按日期排序和布尔优先级:数字到日期的怪异【英文标题】:MySQL Order By Date And Boolean Priority: Number To Date Weirdness 【发布时间】:2020-06-22 15:56:03 【问题描述】:

我有一个表,我想按 date_created 降序排序,但还有一个固定列,如果它是 1,则无论日期如何,该行都应该​​位于顶部。我提出的确实有效的查询如下:

SELECT * FROM my_table 
  WHERE id = SOMEID
  ORDER BY (CASE WHEN pinned = 1 THEN 3 ELSE date_created END) DESC;

我想知道为什么 mysql 认为数字 3 大于 2020 年的所有这些日期。我目前的理论是 mysql 将 3 转换为 3000 年 1 月 1 日的日期,因为如果我使用值 2那么固定的行不在正确的位置。

然后我的问题是:3 比 2020-06-22 08:59:09 大多少,有没有更好的方法来形成这个查询?

额外的问题:有没有一种方法可以确保固定的行也按 date_created 相对于所有其他固定行的降序排序?这对于成为最佳答案而言不如前两个问题重要。

【问题讨论】:

【参考方案1】:

基本上你是对的,但原因恰恰相反。这只是一个简单的字符串比较:

SELECT '2020-01-01' > '3';
+--------------------+
| '2020-01-01' > '3' |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0.01 sec)

SELECT '2020-01-01' < '3';
+--------------------+
| '2020-01-01' < '3' |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

作为替代方案,请考虑ORDER BY pinned = 1 DESC, date

【讨论】:

谢谢,这是一个干净的解决方案,你的解释很有道理。

以上是关于MySQL 按日期排序和布尔优先级:数字到日期的怪异的主要内容,如果未能解决你的问题,请参考以下文章

如何使用数据表插件按日期(从最旧到最新)排序列

PHP 和 MySQL:按最近日期排序并限制 10

MySQL按4个字段日期和时间排序

Angular 5 按日期、文本、数字排序

MySQL 性能优化:按日期时间字段排序

使用 C# 、 LINQ 进行排序