【问题标题】:PHP MySQL - Order Alpha and Numeric stringsPHP MySQL - 排序字母和数字字符串
【发布时间】:2018-06-25 14:37:40
【问题描述】:

我有以下数据:

GROUP 1 - FINANCE
GROUP 10 - SALES
GROUP 11 - MARKETING
GROUP 12 - HR
GROUP 2 - OPS

ORDERING MySQL 询问数据时,它正确地按上述顺序将该数据带回。但是,反正有没有(不改数据就可以按Numeric的顺序排序?如下

GROUP 1 - FINANCE
GROUP 2 - OPS
GROUP 10 - SALES
GROUP 11 - MARKETING
GROUP 12 - HR

谢谢!

【问题讨论】:

  • 该列在数据库中是否为数字,它会自动执行。你能改变架构吗?否则,在订购之前简单地转换为 int 将起作用。 p.s 我很确定这个问题已经在这里回答了很多次,一个简单的谷歌也可以对其进行排序。
  • 这是一篇可能对您有所帮助的文章。 copterlabs.com/natural-sorting-in-mysql 正如@webnoob 提到的那样,您最好更改架构,但如果这不可能,您将更容易在 php IMO 中实现排序(如果数据集很小,这是完全可以接受的)。
  • 你有任何列显示它的数字吗?因为如果你想按数字排序,你需要数字列。

标签: php mysql sorting numeric


【解决方案1】:

添加ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(column, ' ', 2), ' ', -1) AS UNSIGNED) 子句应该会有所帮助。

使用正确的参数嵌套SUBSTRING_INDEX 函数可以拆分和提取字符串部分。在这种情况下,将提取本例中第一个字符串部分之后的数字部分 'GROUP'。

查询

SELECT
 records.data
FROM (

SELECT 
 "GROUP 1 - FINANCE" AS data
UNION 
SELECT 
 "GROUP 10 - SALES" AS data
UNION 
SELECT 
 "GROUP 11 - MARKETING" AS data 
UNION 
SELECT 
 "GROUP 12 - HR" AS data  
UNION 
SELECT 
 "GROUP 2 - OPS" AS data   
) AS records
ORDER BY 
 CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(records.data, ' ', 2), ' ', -1) AS UNSIGNED)

查看演示https://www.db-fiddle.com/f/sGqUeTKaDjihRA3Bg3Myca/0

【讨论】:

    【解决方案2】:

    从 MySQL 8.0 开始你可以使用REPLACEREGEXP_SUBSTRORDER BY 列:

    SELECT * 
    FROM table_name
    ORDER BY CAST(TRIM(REPLACE(REGEXP_SUBSTR(column_name, '(GROUP )([0-9]+)'), 'GROUP', '')) AS UNSIGNED)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2013-10-05
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多