目录
一、思路
二、工具
三、步骤
第一步
第二步
第三步
四、参考文章
做项目的时候涉及到了首拼查询,思路如下:
1.将数据库中搜索名称字段转化为首拼字母连接
2.数据库查询时根据名称常规判断用or连接做第二次的首拼判断
用到的数据库工具是MySQL workbench
涉及到的前两个函数可以放心大胆的直接复制粘贴,主要从函数名开始到end结束,是实现的重点,函数名可以自己替换,当然也要替换掉第二个函数中用到的第一个函数名(如果你想改个fashion的名字的话)
具体做法如下:
1.先建立转化第一个字母的数据库函数firstletter
具体用到的left(取左边第一个字符)等函数网上有解释,想了解的可以自行搜索,这儿只说实现
注:拼音首字母生成过程:
1) 先将编码转换为GBK编码,取汉字的首个单词转为十六进制表示
2) 将首字符的十六进制转化为十进制表示为值X
3) 使用interval返回第一个大于 被比较元素X 的位置index,该函数的比较列表为英文字母的十六进制编码值(汉字的编码是按照英文字母排序范围的)
4) 使用ELT函数将上一步获得的位置index,按照英文字母字符的排序位置输出汉字首字母
函数使用说明:
函数INTERVAL(N,N1,N2,N3,..........): INTERVAL()函数进行比较列表(N1,N2,N3等等)中的N值。该函数如果N 函数ELT(N,str1,str2,str3,...) :如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数个数,返回NULL 使用while循环分割每个字符串的汉字为一个个单词,然后使用第一步中的firstletter将汉字转为英文字母(若是想处理复杂的字符即非汉字字符的情况--不想转化、跳过,只需在分割的过程中使用interval函数按照的字符编码判断是否落在范围内即可) 常规想法是用 update保存,但是很遗憾LZ弄了很久也没有实现,一直报的是无法更新查询语句之类的数据库错,网上也有很多两表字段合并的例子,LZ都没有做到,因此采用如下方法: A.将生成的查询暂存为一张表,语句如下: B.将生成的暂存表与原表连表,并生成目标表的暂存表(目存表) 注意如上的 我将其取为别名letter是为了与原表给首字母存储字段相匹配,即letter代表原表的首拼字段,如果你原表没有,那这个字段你就可以随意取了 C.最后一步了,简单的将原表表名更换,再将目存表的表名变为原表表名,比如原表是a,暂存表是b,那么现在b的名字变成a,原来的a表随意啦,你想删除都可以,不过为了防止出错,取为备份表吧a_backup,这样下次好找些,方便数据比对。 D.细节处理:有没有发现新生成的表只是一张只读表,哈哈,很明显这张表的主键,外键约束都没有了,只好你自己重新弄一遍了,这个就是我的做法了。还有就是这个首拼函数还会错过一些比较麻烦的中文字符不去转化,只能靠自己毅力换了,也不多,几个而已。 以上内容均为本人实践过程,有不明白的可以问我,当然你要问什么函数用法之类的那就免了。本人水平有限,以上文章仅供初学者参考。 [1] MySQL数据库获取汉字拼音的首字母函数 http://www.cnblogs.com/godtrue/p/5005283.html [2] MySQL数据库获取多个汉字拼音的首字母函数 http://www.cnblogs.com/godtrue/p/5005770.html USE `数据库名`;
DROP function IF EXISTS `firstletter`;
DELIMITER $$
USE `数据库名`$$
CREATE DEFINER=`root`@`%` FUNCTION `firstletter`(name varchar(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
declare result varchar(255);
set result=elt(interval(conv(hex(left(convert(name using gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,
0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z');
RETURN result;
END$$
DELIMITER ;
第二步
2.再建立将所有中文首字母连接的函数firstconcatUSE `数据库名`;
DROP function IF EXISTS `firstconcat`;
DELIMITER $$
USE `数据库名`$$
CREATE DEFINER=`root`@`%` FUNCTION `firstconcat`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE V_COMPARE VARCHAR(255);
DECLARE V_RETURN VARCHAR(255);
DECLARE I INT;
SET I = 1;
SET V_RETURN = '';
while I < LENGTH(P_NAME) do
SET V_COMPARE = SUBSTR(P_NAME, I, 1);
IF (V_COMPARE != '') THEN
#SET V_RETURN = CONCAT(V_RETURN, ',', V_COMPARE);
SET V_RETURN = CONCAT(V_RETURN, firstletter(V_COMPARE));
#SET V_RETURN = fristPinyin(V_COMPARE);
END IF;
SET I = I + 1;
end while;
IF (ISNULL(V_RETURN) or V_RETURN = '') THEN
SET V_RETURN = P_NAME;
END IF;
RETURN V_RETURN;
END$$
DELIMITER ;
第三步
3.实现以上两个函数基本就是实现一大半了,你可以用一下语句看看效果select id,a.name,firstconcat(a.name) l from 表名 a
a.name,firstconcat(a.name) l from 表名 acreate table 暂存表表名 as select a.id,a.name,firstletter(a.name) firstletter,firstconcat(a.name) firstconcat
from 查询表表名 a;
create table 目存表表名 as select a.id,a.name,b.firstconcat letter,a.sort,a.area_id
from 查询表表名 a left join 暂存表表名 b on a.id=b.id;
b.firstconcat letter
四、参考文章