mysql - SQL 排序版本数字 + 字符串

标签 mysql sql string sql-order-by version

我必须按版本列对表进行排序,版本列是随机字符串 + 数字 (x.xx.xx)。例如,我的表如下所示:

string 1.14.2
string 1.14.1
string 1.14
string 1.14.3
string 1.14.4
string 1.11
string 1.10
string 1.10.2
string 1.9
string 1.9.4
string 1.9.2
string 1.8
string 1.8.8
string 1.4.6

我的结果必须如下所示:

string 1.14.4
string 1.14.3
string 1.14.2
string 1.14.1
string 1.11
string 1.10.2
string 1.10
string 1.9.4
string 1.9.2
string 1.9
string 1.8.8
string 1.8
string 1.4.6

我现在的sql是

SELECT * FROM t_plugins WHERE a_category = 'string' AND a_master_ig = 2
ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(trim(a_name), " ", -1), ".", -1)```


最佳答案

像这样的东西应该可以工作:

order by
    cast(
        substring_index(
            substring_index(a_name, ' ', -1),
            '.', 
            1
         ) 
         as unsigned
    ) desc,
    cast(
        right(
            substring_index(a_name, ' ', -1),
            length(substring_index(a_name, ' ', -1)) 
                - locate('.', substring_index(a_name, ' ', -1))
        )
        as decimal(10, 5)
    ) desc

这个想法是:

  • 将字符串与版本号分开

  • 隔离版本号的第一位数字(并将其转换为整数值)并将其用作第一个排序标准

  • 然后分离第二部分和第三部分,将其转换为十进制值,并将其用作第二个排序标准

Demo on DB Fiddle :

| a_name        |
| :------------ |
| string 1.14.4 |
| string 1.14.3 |
| string 1.14.2 |
| string 1.14.1 |
| string 1.14   |
| string 1.11   |
| string 1.10.2 |
| string 1.10   |
| string 1.9.4  |
| string 1.9.2  |
| string 1.9    |
| string 1.8.8  |
| string 1.8    |
| string 1.4.6  |

关于mysql - SQL 排序版本数字 + 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58965266/

相关文章:

mysql - 合并两个 SQL 表并进行替换?

c# - 进行多次更新时如何避免在 Entity Framework 4 中锁定数据库

MySQL 排序 : why is "5x" after "11x"?

c - 在c中输入算术语句并返回值

php - 使用 php 在字符串中搜索数百万个术语

mysql - SQL:根据另一个表中的列值选择列

php - 使用 JSON 将记录插入数据库

mysql - 如何按 'less than equal to' 分组对查询结果进行分组?

sql - 使用 `select table_name.*` 的优缺点是什么?

c++ - 比较两个 vector<Structs> 的字符串元素