0%

MySQL中按照姓名或者中文首字母区间查询排序

英文26个字母中除了i,u,v三个字母不能成为汉语拼音的首字母外,其它的字母都可以。
先上一个表格,说明下各个字母字母的拼音编码的开始值和结束值

字母 起值 止值
A 45217 45252
B 45253 45760
C 45761 46317
D 46318 46825
E 46826 47009
F 47010 47296
G 47297 47613
H 47614 48118
J 48119 49061
K 49062 49323
L 49324 49895
M 49896 50370
N 50371 50613
O 50614 50621
P 50622 50905
Q 50906 51386
R 51387 51445
S 51446 52217
T 52218 52697
W 52698 52979
X 52980 53688
Y 53689 54480
Z 54481 55289

用途:
假如需要查询数据库中 以A-G字母开头的省,并且按照字母顺序排序:
数据库中数据
数据库中数据

需要的结果

需要的结果

类似这种结构或者这种数据排序,我们直接可以执行下面的sql语句查询

select * from wr_province where CONV(HEX(left(CONVERT(province_name USING gbk),1)),16,10) between 45217 and 47613 ORDER BY convert(province_name USING gbk) asc;

sql结果

下面有一个我在自己项目中使用的例子,用的是循环查询,大家可以看看结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$sort = array(
'A-G' => array('45217', '47613'),
'H-K' => array('47614', '49323'),
'L-S' => array('49324', '52217'),
'T-Z' => array('52218', '55289')
);
$model = D('Province');
$array = array();
foreach ($sort as $key => $value){
$sql = "select * from wr_province where CONV(HEX(left(CONVERT(province_name USING gbk),1)),16,10) between {$value[0]} and {$value[1]} ORDER BY convert(province_name USING gbk) asc";
$data = $model->query($sql);
foreach ($data as $value){
$array[$key][] = array('code'=>$value['province_id'],'address'=>$value['province_name']);
}
}
debug(json_encode($array));
//结果:

sql结果

满足需求;