【问题标题】:How make for order by name in MYSQL as with order name in Window如何在 MYSQL 中按名称创建订单,就像在窗口中使用订单名称一样
【发布时间】:2010-10-21 16:58:36
【问题描述】:

表 有行的图片有名字

1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg,8.jpg,9.jpg,10.jpg,11.jpg
select * from Picture order by name

mysql 命令:1.jpg,10.jpg,11.jpg,2.jpg,3.jpg,......

问题:

我希望它像 Window 1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg,8.jpg,9.jpg,10.jpg,11.jpg 那样对所有类型名称进行排序

它必须与其他案例一起使用

flower01.jpg,flower02.jpg,flower031.jpg,....,flower10.jpg

请帮帮我

【问题讨论】:

  • 它使用字母排序顺序。仔细想想,mysql 做的是对的。
  • @klaus 是的,但在这种情况下仍然不是很理想。在 mySQL 中似乎没有一个简单的解决方案。我很惊讶!
  • Natural Sort in MySQL 的可能重复项
  • 还有很多,也许一个包含解决方案,我懒得筛选它们:stackoverflow.com/search?q=mysql+natural+sort

标签: sql mysql natural-sort


【解决方案1】:

你基本上有4个选择。

  1. 将名称更改为数字类型,并删除 .jpg(稍后在代码中添加)
  2. 添加“订单”列并按此排序
  3. 在您的代码中排序,而不是在 SQL 中
  4. 使用演员阵容“黑客”(例如 CAST(NAME AS UNSIGNED)

【讨论】:

    【解决方案2】:

    一种骇人听闻的方法:

    ... ORDER BY CAST(name AS UNSIGNED);
    

    编辑:另一种选择是:

     ... ORDER BY LPAD(name,N,'0');
    

    N 是列的最大宽度。 遗憾的是,MySQL 本身不支持自然排序 AFAIK。

    【讨论】:

    • 在您提到的所有情况下:是的。在自然排序可能很方便的所有情况下:确实没有。见the link Pekka provided
    【解决方案3】:

    ODER BY name 看到 name 是一个字符串,并相应地按字符对它进行排序。您必须让 MySQL 将名称解释为数值。一种方式可能是这样的:

    select * from Picture order by name * 1;
    

    【讨论】:

    • 我发现一个明确的 CAST 比这个更可取,因为它需要长期维护:五年后看代码的人不会明白这是为了什么 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多