MySQL - 如何对数字上的字母数字数据进行排序

时间:2017-04-19 17:04:33

标签: mysql sorting

我尝试对我的一个包含MySQL中字母数字数据的列进行排序。数据以字符开头,以数字结尾。

以下是我的示例数据集:

insert into test_sort (port) values ('GI 1/0/1');
insert into test_sort (port) values ('GI 1/0/4');
insert into test_sort (port) values ('GI 1/0/10');
insert into test_sort (port) values ('GI 1/0/6');
insert into test_sort (port) values ('GI 1/0/3');
insert into test_sort (port) values ('GI 1/0/12');
insert into test_sort (port) values ('TE 1/1/3');
insert into test_sort (port) values ('GI 1/1/1');
insert into test_sort (port) values ('GI 2/0/11');
insert into test_sort (port) values ('GI 2/0/1');
insert into test_sort (port) values ('GI 2/0/3');
insert into test_sort (port) values ('GI 1/1/2');
insert into test_sort (port) values ('TE 1/1/4');

我尝试获得此输出:

GI 1/0/1
GI 1/0/3
GI 1/0/4
GI 1/0/6
GI 1/0/10
GI 1/0/12
GI 1/1/1
GI 1/1/2
TE 1/1/3
TE 1/1/4
GI 2/0/1
GI 2/0/3
GI 2/0/11

我尝试按长度排序,使用子字符串,二进制,* 1但没有成功。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

没有内置的排序功能或排序规则会跳到字符串中的第4个字符并根据它进行排序。如果你真的需要这种排序,你应该把这个字符串分成两个字段,然后执行二维排序。

即。像这样的表:

port_alpha   port_numeric
----------   ------------
GI           2/0/1
TE           1/1/3
...          ...

查询如:

SELECT CONCAT_WS(' ', port_alpha, port_numeric) AS port
FROM test_sort
ORDER BY port_numeric ASC, port_alpha ASC

不分割你的领域你可以做类似的事情:

SELECT port FROM test_sort
ORDER BY SUBSTRING_INDEX(port, ' ', -1) ASC, port ASC

这并不理想,因为这会禁止在端口字段上使用索引来执行排序,并使其成为性能不佳的查询。

答案 1 :(得分:0)

你可以使用这样的查询:

int array[] = {4, 2, 5, 3};

测试查询

SELECT *
FROM test_sort
ORDER BY 
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',1),' ',-1)+0,
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',2),'/',-1)+0,
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',3),'/',-1)+0;