2.
自定义排序
自定义排序是根据自己想要的特定字符串(数字)顺序进行排序。
主要是使用函数
FIELD(str,str1,str2,str3,...)
MySQL
的自定义排序,
str
与
str1
、
str2
、
str3...
进行比较,并按照
str1,str2,str3...
的顺序输出,如果遇到
str
为
null
或者不存在
str1,str2,str3...
中的情况的则序列为
0
,
select * from test order by field(value,'test1','test2','test3','test4') asc/desc
select * from test where value in('test1','test2','test3','test4') order by field(value,'test1','test2','test3','test4') asc/desc--
保证只满足条件的进行排序
3.
按中文拼音字母排序
如果表字段使用的
GBK
编码的话,我们可以直接
order by value
,因为
GBK
本身就是按照拼音字母排序
ABCDEFGHIGK...
,当第一位相同的时候会比较第二位,以此类推。 如果表字段使用的
UTF-8
编码的话,通常我们都会的编码,这样我们可以使用
MySQL
的
convert
方法开转换
gbk
进行排序。
select * from user ORDER BY CONVERT(name USING GBK) ASC;
我们可以从下图看出,这种配需方式没有将中文和英文结合起来一起排序,而是各自的排序。故而我们使用mysql的存储过程做到不管是用户的姓名为中文或是英文,都可以综合的排序,具体代码如下:
1 DELIMITER $$
2 CREATE FUNCTION `fristPinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
3 DETERMINISTIC
4 BEGIN
5 DECLARE V_RETURN VARCHAR(255);
6 DECLARE V_BOOL INT DEFAULT 0;
7 DECLARE FIRST_VARCHAR VARCHAR(1);
9 SET FIRST_VARCHAR = left(CONVERT(P_NAME USING gbk),1);
10 SELECT FIRST_VARCHAR REGEXP '[a-zA-Z]' INTO V_BOOL;
11 IF V_BOOL = 1 THEN
12 SET V_RETURN = FIRST_VARCHAR;
13 ELSE
14 SET V_RETURN = ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),16,10),
15 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
16 0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
17 0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
18 'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z');
19 END IF;
20 RETURN V_RETURN;
21 END$$
22 DELIMITER;
View Code
查询语句为:select fristPinyin(name) as pinyin_index,name from app_user ORDER BY fristPinyin(name) ASC ;
1)fristPinyin
函数只需要运行一次,后面直接操作查询语句即可,如果后面也一起运行会出现:
[Err] 1304 - FUNCTION fristPinyin already exists
;
2)
由于汉语拼音没有以
'I','U','V','W'
开头的,所以转化的只有
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'W', 'X', 'Y', 'Z'
。
三种排序对比结果:
在全栈的道路上,积极向上、成熟稳重、谦虚好学、怀着炽热的心向前方的走得更远。