按字母数字字符排序

时间:2016-05-04 15:08:34

标签: mysql

我已经看过几个关于这个问题的问题,但是我无法理解我所看到的内容,所以我请求你原谅我提出一个问题已被问过几个问题。已经很久了 - 我两周前才开始学习所有这些sql,php等等东西,因为我需要制作一个工具来帮助我完成我的工作,所以我仍然是一个绝对的傻瓜:(

无论如何,我使用的是mysql,我正在用以下方式进行查询:

SELECT * FROM table ORDER BY col1

On" col1"我的价值观如下:

1/16
2/16
12/16
37/12
74/16
114/13
225/16
etc

此列上的值始终跟随" X / YY",其中" YY"总是两位数," X"可以是一位数到五位或六位数。 可以理解的是,由于列被设置为varchar以便接受" /",当我尝试对值进行排序时,我得到类似的内容:

1/16
114/13
12/16
2/16
225/16
37/12
74/16

而不是我想要的:

37/12
114/13
1/16
2/16
12/16
74/16
225/16

含义:首先按右边两位数排序,然后按" /"左边的排序。 我知道我可以通过存储" X"和" YY"在不同的栏目上,但我真的很感激,如果有人能告诉我如何做到这一点。

祝你好运, T.F。

1 个答案:

答案 0 :(得分:2)

使用castsubstring_index,您可以排序以获得所需的输出。

SELECT
    *
FROM
    `37031650`
ORDER BY
    cast(
        substring_index(col1, '/', - 1) AS signed INTEGER
    ),
    cast(
        substring_index(col1, '/', 1) AS signed INTEGER
    ) ASC

实施例

mysql> select * from `37031650`;
+--------+
| col1   |
+--------+
| 1/16   |
| 114/13 |
| 12/16  |
| 2/16   |
| 225/16 |
| 37/12  |
| 74/16  |
+--------+
7 rows in set

mysql> select * from `37031650` order by cast(substring_index(col1,'/', -1) as signed integer), cast(substring_index(col1,'/', 1) as signed integer) asc;
+--------+
| col1   |
+--------+
| 37/12  |
| 114/13 |
| 1/16   |
| 2/16   |
| 12/16  |
| 74/16  |
| 225/16 |
+--------+
7 rows in set