【问题标题】:How can I do natural sort in MySQL如何在 MySQL 中进行自然排序
【发布时间】:2015-06-17 22:37:55
【问题描述】:

我在 Stack Overflow 和 Google 上看到过很多帖子,但没有一个真正有帮助

这是情况,这些是我的列值:

ICT_Member_2014_06_02
ICT_Member_2015_05_05
Creative_Member_1992_09_01
Zealous_Ok_2015_12_22

所以我希望我的结果应该基于字母出现,然后是日期(数字), 它应该首先按字母升序排序,然后按日期排序。

有什么解决办法吗?

谢谢

【问题讨论】:

  • 原提问者想要日期降序。

标签: php mysql sorting datetime sql-order-by


【解决方案1】:
SELECT * FROM yourTable ORDER BY ICT_Member_2014_06_02 DESC, Zealous_Ok_2015_12_22 DESC;

【讨论】:

  • 哦,在这种情况下,查询将是:SELECT * FROM yourTable ORDER BY key1 DESC, key2 DESC;
  • 这里的key1和key2是什么?
【解决方案2】:

试试这个

MySQL:先按长度排序,再按列值排序

SELECT col_name
       FROM sorting_test
       ORDER BY LENGTH(col_name), col_name

【讨论】:

  • 那行不通,这只有在我们在所有列值中都有公共字符串时才有效。
【解决方案3】:

试试这个:

ORDER BY col_value, 
         DATE(RIGHT(col_value,10)) DESC

ORDER BY 中的第一项将处理您的前缀。

第二项 -- DATE(RIGHT(col_value,10) -- 将提取您的值的最后十个字符 -- 日期。然后它将尝试将它们作为 DATE 值处理,并按顺序对它们进行排序。如果日期转换失败(因为您的某些值没有日期),它们将在排序中排在第一位。

【讨论】:

  • ICT_Member - 2012-06-07 出现在 ICT Member - 2012-10-25 之前,这是不正确的
  • 对不起,我漏掉了一个括号。固定的。但是请解释为什么ICT_Member - 2012-06-07 不应该出现在ICT_Member - 2012-10-25 之前。在我看来应该是这样。
  • 我正在根据日期进行降序,所以我正在执行 DATE(RIGHT(col_value,10)) DESC ,这意味着它首先应该根据 DATE( RIGHT(col_value,10))
  • 您的问题没有要求日期降序。但它仍然是微不足道的。只需将 DESC 放在第二个排序项之后。
  • 请看我最后的评论,我在第二个任期后使用 DESC
猜你喜欢
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多