【问题标题】:How to order non-integer records in MySql?如何在 MySql 中对非整数记录进行排序?
【发布时间】:2018-02-01 20:01:40
【问题描述】:

我正在尝试按 DESC 顺序对一些 MySQL 记录进行排序并获取添加的最后一条记录。

这些是我的记录,它们都存储为字符串:

1/2017
1/2018
2/2017
2/2018
3/2017

我想获得 1/2018 的值。记录以当年为准 最后添加的记录是 1/2018,下一个是 2/2018,依此类推。

这是我的查询:

SELECT NoControl FROM cita ORDER BY NoControl DESC LIMIT 1

但我得到的最后一条记录是 3/2017。

【问题讨论】:

  • 那些是datetime 字段吗?
  • 不要将日期存储为字符串,使用本地数据库日期/时间类型。也就是说,如果您必须将日期存储为字符串,请使用“最重要的值优先”格式,例如 YYYY/MM/DD,然后它们自然会正确排序。
  • 给你一点提示:在做任何事情之前先思考是值得的,而你在这里所做的并不是好的做法。存储日期而不是使用已经内置的 MySQL 日期(和时间)函数总是效果最好。如果您对此不太了解,那么重新设计数据库可能还为时不晚。
  • 要是反过来就好了吧?

标签: php html mysql phpmyadmin


【解决方案1】:

如果你有相同的模式 m/yyyy,你可以使用一些字符串操作函数,例如:

SELECT NoControl 
FROM cita 
ORDER BY right(NoControl,4), DESC left(NoControl,1) DESC  LIMIT 1

但您应该避免将日期值存储为字符串..

或将字符串转换为正确的日期

SELECT NoControl 
FROM cita 
ORDER BY str_to_date(NoControl,'%m/%Y') DESC LIMIT 1

【讨论】:

    【解决方案2】:

    使用SUBSTRING_INDEX提取第一部分和第二部分,CAST为整数并排序:

    SELECT str
    FROM testdata
    ORDER BY 
        CAST(SUBSTRING_INDEX(str, '/', -1) AS UNSIGNED) DESC,
        CAST(SUBSTRING_INDEX(str, '/',  1) AS UNSIGNED) DESC
    LIMIT 0, 1
    

    SQL Fiddle

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 2014-09-26
      • 2016-03-02
      • 2022-01-06
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多