【问题标题】:MySQL query with alphanumeric order具有字母数字顺序的 MySQL 查询
【发布时间】:2012-01-24 15:24:27
【问题描述】:

我正在尝试获取一些产品型号的列表,所有型号都是字母数字。

我试过了

ORDER BY CAST(field_name AS UNSIGNED) 

ORDER BY field_name + 0

ORDER BY LENGTH(field_name)

还有其他一些方法。

它们适用于大多数情况,但有些值与顺序不匹配。

我得到的结果是这样的

EAG-75

EAG-110

...

ESCG-500

ESCG-600

...

EYG-40

EYG-55

...

EMG-440

EMG-20

EMG-27

...

EAG-100

...

我不明白是什么原因造成的。

请帮忙。

提前致谢

【问题讨论】:

  • 您希望它们如何排序?举个例子。如果您按字母顺序排序,EAG-110 在 EAG-75 之前
  • 我希望它们像 EAG-75 、 EAG-100 、 EAG-110 、 EMG-20 一样按字母数字排序...
  • @Onur:我认为您实际上的意思是“每个非数字前缀,按数字排序”

标签: mysql sql-order-by alphanumeric


【解决方案1】:

如果您想对每个非数字前缀进行正确的数字排序,则需要分别对 2 位进行排序

ORDER BY
    -- sort by prefix only
    LEFT(MyCol, INSTR(col, '-')-1),  
    -- sort numerically within prefix
    CAST(SUBSTRING(MyCol, INSTR(col, '-')+1) AS UNSIGNED) 

【讨论】:

  • 只要您的所有型号都采用 AAA-## 格式,您不会比这个解决方案更好。
  • 嗨,它在这种格式下工作得很好,但是如果在同一个查询中有一些其他结果,比如 AAAA#,那么它对于 4 个字符的结果就不能很好地工作,我该如何解决?提前致谢
  • 哦,我想我通过将 LEFT(MyCol, INSTR(col, '-')-1) 中的 -1 更改为 -2 来修复它
【解决方案2】:

ORDER BY LENGTH(field_name), field_name 会更适合你吗?

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 2013-05-17
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多