Mysql 按自定义模式排序列

Mysql 按自定义模式排序列,mysql,sql,Mysql,Sql,我正在尝试订购发票数据列。发票编码字段由以下内容组成: 大写字母(如A-Z) 实际年份(如19) 反斜杠(/) 发票编号(如100) 真实示例:F19/1234 此时,我正在使用以下查询按发票编码订购 select * from `invoices` order by LENGTH(codification) desc, `codification` desc 这对2019年的发票有效,问题是2020年的发票编号重置为0,因此该订单失败 现在我有以下几点 F19/102 F19/101

我正在尝试订购发票数据列。发票编码字段由以下内容组成:

  • 大写字母(如A-Z)
  • 实际年份(如19)
  • 反斜杠(/)
  • 发票编号(如100)
  • 真实示例:F19/1234

    此时,我正在使用以下查询按发票编码订购

    select * from `invoices` 
    order by LENGTH(codification) desc, `codification` desc 
    
    这对2019年的发票有效,问题是2020年的发票编号重置为0,因此该订单失败

    现在我有以下几点

    • F19/102
    • F19/101
    • F19/100
    • F20/1
    • F20/0
    如何按年份和发票号降序订购

    我试图按REGEX_子字符串排序,但这不起作用,我认为此查询没有任何作用

    select * from `invoices` 
    order by REGEXP_SUBSTR(`codification`, '[0-9]+(?=\/)') desc, REGEXP_SUBSTR(`codification`, '([a-z0-9_-]*[\/]?)$') desc
    
    我想要完成的订单是(按年说明,发票编号)

    • F20/1
    • F20/0
    • F19/102
    • F19/101
    • F19/100

    我认为这会奏效:

    order by codification desc
    
    当2020年的发票号超过10时,您将遇到问题。要处理这个问题:

    order by substring_index(codification, '/', 1),
             substring_index(codification, '/', -1) + 0
    

    为什么不试着直接按元素排序呢。例如,
    按年份说明订购,发票号说明

    可能还需要为大写字母添加元素