MySQL ORDER BY排序求助:按规则排序含数字的字符串列
解决MySQL中自定义格式字符串的排序问题
没问题,我来帮你搞定这个排序需求!你的数据格式是R_X_TP(Y),想要先按X的数值大小排序(比如5 < 6 < 7 < 50),再按括号里的Y数值排序(比如1 < 6 < 10),直接用普通的ORDER BY肯定不行——因为字符串排序会把R_50_TP(1)排在R_6_TP(1)前面(字符串比较时'5'比'6'小)。
解决方案:提取数值并转换为整数排序
我们可以通过MySQL的字符串函数提取出X和Y的数值,转换成整数后再排序,具体查询如下(把your_column换成你的列名,your_table换成你的表名):
SELECT your_column FROM your_table ORDER BY -- 提取下划线之间的数字(X部分)并转为整数 CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(your_column, '_', 2), '_', -1) AS UNSIGNED), -- 提取括号内的数字(Y部分)并转为整数 CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(your_column, '(', -1), ')', 1) AS UNSIGNED);
代码逻辑拆解
- 提取X的逻辑:
SUBSTRING_INDEX(your_column, '_', 2)会截取到R_5这类片段,再用SUBSTRING_INDEX(..., '_', -1)就得到5这个字符串,最后CAST(... AS UNSIGNED)把它转成无符号整数,确保按数值大小排序,而不是字符串顺序。 - 提取Y的逻辑:
SUBSTRING_INDEX(your_column, '(', -1)会截取到6)这类片段,再用SUBSTRING_INDEX(..., ')', 1)得到6,同样转成整数后排序。
把你提供的测试数据代入这个查询,就能得到你想要的排序结果:R_5_TP(6)、R_5_TP(7)、R_5_TP(8)、R_6_TP(1)、R_6_TP(6)、R_6_TP(10)、R_7_TP(1)、R_50_TP(1)
内容的提问来源于stack exchange,提问作者manikumar
相关产品推荐
相关产品推荐

