我在SO上看到了很多这样的问题,我试图在我的特定情况下实现答案,但我没有运气。一些帮助将不胜感激。
SELECT `avatar` from `users` ORDER BY ABS(`avatar`) ASC;
+--------------------------------+
| avatar |
+--------------------------------+
| 0/1_default.jpg |
| 1/3_483487-1440x900_qp8a5a.jpg |
| 1/122_default.jpg |
| 1/321_default.jpg |
| 1/25_wefvvv.jpg |
| 1/1000_latest.jpg |
| 2/12_wefwefwef.jpg |
| 2/1_default.jpg |
+--------------------------------+
我尝试按ABS和列进行排序,但除非我创建了新列或专用表,否则我找不到按照我想要的方式对其进行排序的方法。
基本上,我想以数字方式对其进行排序,并且期望的结果将是:
0/1
1/3
1/25
1/122
1/321
2/1
2/12
从对SO的搜索中,我知道有SUBSTR
函数,但中间有'/',我不知道如何才能正确排序。
答案 0 :(得分:3)
更新如果avatar
的格式已修复,那么您可以这样做
SELECT avatar
FROM users
ORDER BY 1 * SUBSTRING_INDEX(avatar, '/', 1),
1 * SUBSTRING_INDEX(SUBSTRING_INDEX(avatar, '_', 1), '/', -1),
SUBSTR(avatar, INSTR(avatar, '_') + 1)
1 * SUBSTRING_INDEX(avatar, '/', 1)
在第一个/
之前获取所有内容并将其转换为数字值1 * SUBSTRING_INDEX(SUBSTRING_INDEX(avatar, '_', 1), '/', -1)
获取/
和第一_
之间的所有内容并将其转换为数字值SUBSTR(avatar, INSTR(avatar, '_') + 1)
在_
输出:
+--------------------------------+ | avatar | +--------------------------------+ | 0/1_default.jpg | | 1/3_483487-1440x900_qp8a5a.jpg | | 1/25_wefvvv.jpg | | 1/122_default.jpg | | 1/321_default.jpg | | 1/1000_latest.jpg | | 2/1_default.jpg | | 2/12_wefwefwef.jpg | +--------------------------------+
这是 SQLFiddle 演示
根据您的排序顺序获取最大avatar
值
SELECT avatar
FROM users
ORDER BY 1 * SUBSTRING_INDEX(avatar, '/', 1) DESC,
1 * SUBSTRING_INDEX(SUBSTRING_INDEX(avatar, '_', 1), '/', -1) DESC,
SUBSTR(avatar, INSTR(avatar, '_') + 1) DESC
LIMIT 1
输出:
| AVATAR | ---------------------- | 2/12_wefwefwef.jpg |
这是 SQLFiddle 演示