我在排序之后的 ASC 中的列名(equipment_no)后面有一个列如下的值,并想知道如何对其进行排序正确如下一个清单所示。
SELECT equipment_no FROM fas_details WHERE equipment_no LIKE 'T%' ORDER BY equipment_no
请告诉我你的建议。谢谢。
mysql如何排序
T - AG - 01
T - AG - 02
T - AG - 07
T - AG - 08
T - AG - 09
T - AG - 10
T - AG - 100
T - AG - 101
T - AG - 102
T - AG - 103
T - AG - 104
T - AG - 11
T - AG - 12
T - AG - 13
我希望如何
T - AG - 01
T - AG - 02
T - AG - 07
T - AG - 08
T - AG - 09
T - AG - 10
T - AG - 11
T - AG - 12
T - AG - 13
T - AG - 100
T - AG - 101
T - AG - 102
T - AG - 103
T - AG - 104
答案 0 :(得分:3)
试试这个:
Order By CAST(SUBSTRING_INDEX(equipment_no,'-',-1) AS UNSIGNED)
或者您可以尝试使用RIGHT,如
CAST(RIGHT(equipment_no, (CHARINDEX('-',REVERSE(equipment_no),0))-1) AS UNSIGNED)
答案 1 :(得分:2)
使用substring_index
函数从字符串中获取数字,然后按顺序将其转换为无符号整数:
SELECT equipment_no FROM fas_details WHERE equipment_no LIKE 'T%'
ORDER BY cast(substring_index(equipment_no,'-',-1) as unsigned)
答案 2 :(得分:1)
我认为你想在按设备排序的数字部分考虑时按升序字母顺序对equipment_no进行排序。
SELECT equipment_no FROM fas_details WHERE equipment_no LIKE 'T%' ORDER BY substring(equipment_no,1,9), substring(equipment_no,10)*1
我假设equipment_no的前9个字符是字母,而其余字符是数字字符。将数字子串乘以1会强制它为数字。
答案 3 :(得分:0)
我认为这样做的一个好方法是按数字标记排序。它可以使用SUBSTRING函数获得(您的结构似乎已修复)。
但是,性能不是很好,最好的选择是将该数字实际存储在一个单独的列中。存储可以由您的应用程序直接完成,也可以using auto generated columns。
还可以找到有关您的问题的更多详细信息here。
答案 4 :(得分:0)
由于只有最后一位数字的区别,我们可以通过
来实现 ORDER BY LENGTH(equipment_no), equipment_no;
在这里,它将首先按字符串的长度按升序排序结果,然后按该字符串排序。
<强>查询强>
SELECT * FROM fas_details
ORDER BY LENGTH(equipment_no), equipment_no;
在你的回答中,结果是按整个字符串排序。因此,当您订购字符串时,例如:2
和10
,10
将首先出现。所以只需先按字符串的长度排序。
所以你可能需要改变你的SQL查询,如下所示。
<强>查询强>
SELECT equipment_no
FROM fas_details
WHERE equipment_no LIKE 'T%'
ORDER BY LENGTH(equipment_no), equipment_no;
<强>结果强>
+---------------+
| equipment_no |
+---------------+
| T - AG - 01 |
| T - AG - 02 |
| T - AG - 07 |
| T - AG - 08 |
| T - AG - 09 |
| T - AG - 10 |
| T - AG - 11 |
| T - AG - 12 |
| T - AG - 13 |
| T - AG - 100 |
| T - AG - 101 |
| T - AG - 102 |
| T - AG - 103 |
| T - AG - 104 |
+---------------+