【问题标题】:MySQL sorting with alphanumeric prefixMySQL 使用字母数字前缀排序
【发布时间】:2015-10-02 08:57:01
【问题描述】:

我有一个数据库,其中有一列包含以下数据:

aaa-1
aaa-2
aaa-3
...
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000

当我按升序查询和排序数据时,我得到:

aaa-1
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000
...
aaa-2
...
aaa-3

这实际上是正确的(机器)排序方式吗?订单是否因为aaa- 前缀而搞砸了?我该如何按照人类的方式进行排序(即看起来像第一个 sn-p 的东西)?

附:如果问题确实出在前缀上,有没有办法将其删除并仅使用数字组件进行排序?

附言有人建议我,我应该只更改我的数据并添加前导零,例如aaa-0001aaa-0002 等。但是,我不愿意采用这种方法,因为每次列表上升 10 位时,我必须重新格式化此列。

提前谢谢大家! :)

【问题讨论】:

    标签: mysql sorting columnsorting


    【解决方案1】:

    您可以提取数字部分,将其转换为数字数据类型,然后执行ORDER BY

    SELECT mytable.*,
        CAST(SUBSTRING_INDEX(mycolumn, '-', - 1) AS UNSIGNED) mycolumnintdata
    FROM
        mytable
    ORDER BY mycolumnintdata;
    

    如果存在与数字不匹配的表达式,CAST 函数将返回0,并且将首先显示这些记录。如果需要,您可以单独处理。

    【讨论】:

    • 谢谢!这是为我做的:)
    • 这很酷@doraemond!感谢您接受答案。编程愉快!
    • @James Jithin 它对我很有效。但不幸的是,我需要在准备好的语句中加入我的其他查询,这些查询已经是准备好的语句格式。我陷入了 bind_result “警告:mysqli_stmt::bind_result():绑定变量的数量与字段的数量不匹配......”
    • @James Jithin 在我准备代码时,我实际上找到了答案。解决方案是在 bind_result (x,x,x,$mycolumnintdata) 中添加另一个变量。谢谢你的提问。没有你问,我不会找到答案。
    【解决方案2】:

    我也遇到过类似的问题,解决这个问题的诀窍就是这个

    *"ORDER BY LENGTH(column_name), column_name

    只要值的非数字部分长度相同,这将在 10 之前排序 1,在 100 之前排序 10,等等。"*

    Andreas Bergströmthis question 上给出。

    希望对某人有所帮助。

    【讨论】:

      【解决方案3】:

      这是字母顺序,
      你想要数字顺序,
      为此,您必须在 ORDER BY 子句中

      1. 修剪余弦“aaa-”部分
      2. 将其转换为数字

        转换(SUBSTRING(val, 3), 整数)

      【讨论】:

      • 我现在看到该列是一个字符串,并且被视为这样。因此,较短的字符串将首先被排序。这真的是数据库的局限性,因为它对所包含的信息没有深入了解吗?
      【解决方案4】:

      我会给你一个样本排序。不是基于您的数据样本,但这可以帮助您。

      假设你有这样的数据:

      id
      ----
      1
      2
      6
      10
      13
      

      当你这样做时ORDER BY id ASC 会返回:

      id
      ----
      1
      10
      13
      2
      6
      

      我建议,使用LPAD。 这个查询:SELECT LPAD('12',5,'0')返回00012

      所以当你有我上面提供的表格数据时,你可以像这样对它们进行排序:

      SELECT * FROM TABLE
      ORDER BY LPAD(ID,7,'0') ASC
      

      根据您的数据。 SELECT SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3)返回100
      所以,SELECT LPAD( SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3), 7, '0') 返回00000100

      所以你可以组合字符串函数,例如SUBSTRLPAD。现在有什么线索吗?

      【讨论】:

      • 在您的示例中,即使不使用 LDAP,该列也不会正确排序,因为它只是数字数据?
      • 是的,我现在了解 LPAD 的工作原理,谢谢!不过,我想知道使用你的方法还是詹姆斯的方法效果更快。
      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2017-06-05
      相关资源
      最近更新 更多