MySQL将varchar排序为数字问题

时间:2013-08-19 01:34:30

标签: mysql sql database sorting

我在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函数,但中间有'/',我不知道如何才能正确排序。

1 个答案:

答案 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 演示