0

我在 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功能,但中间有“/”,我不确定如何让它正确排序。

4

1 回答 1

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)获取/和 first之间的所有内容_并将其转换为数值
  • 最后SUBSTR(avatar, INSTR(avatar, '_') + 1)得到一切_

输出:

+--------------------------------+
| 头像 |
+--------------------------------+
| 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

输出:

| 阿凡达 |
----------------------
| 2/12_wefwefwef.jpg |

这是SQLFiddle演示

于 2013-08-19T01:44:36.287 回答