至于一些网友可能说用gbk_bin 或是gbk来排,仍然存在不能对中英文混合排序的缺点,
原问T帖1: http://topic.csdn.net/u/20081126/12/bb797a63-312a-4493-8884-e3cbb68a10d6.html
原问T帖2: http://topic.csdn.net/u/20081125/14/aec53d61-22a5-4e6c-848c-b5756a3d68bb.html
原问T帖3: http://topic.csdn.net/u/20081125/17/8241993a-9069-4ef4-993b-689191474183.html
总共分数:300分,,,,,, 问T解决后,去以上3帖6言,然后给予分数
有好想法的高手,请指教.
汉字拼音表(不考虑多音字,若有多音字按任一种取即可)
hzpy
字段: hz py
安 an
踏 ta
昂 ang
爱 ai
可 ke
视 shi
国 guo
者 zhe
达 da分类表 category
字段: name
adidas
安踏
昂达
爱可视
爱国者 需要对category表的name字段进行搜索排序,如果有中文,那么从汉字拼音表hzpy中,进行搜索汉字相应的拼音,取头字母,
如 安踏--at 安踏--at 昂达---ad 爱可视---aks 爱国者--agz ,然后把它们按照拼音排序,形成一张临时分类表
临时分类表 temp_table
字段: name py
adidas adidas
安踏 at
昂达 ad
爱可视 aks
爱国者 agz搜索排序后要得到排序后的结果为------- 昂达 adidas 爱国者 爱可视 安踏
初步设想为(要求在存储过程中实现)有一个得到某个词的拼音首字母的函数 first_letter()
搜索排序时,如果name为中文,则用first_letter()转化一下,扔进temp_table中,最后进行一个排序即可得到结果。大家一起来考虑一下这种方式可行性,或有谁有更好的方法,问T总分300分,,,,,,大家一起来学习,,,,
原问T帖1: http://topic.csdn.net/u/20081126/12/bb797a63-312a-4493-8884-e3cbb68a10d6.html
原问T帖2: http://topic.csdn.net/u/20081125/14/aec53d61-22a5-4e6c-848c-b5756a3d68bb.html
原问T帖3: http://topic.csdn.net/u/20081125/17/8241993a-9069-4ef4-993b-689191474183.html
总共分数:300分,,,,,, 问T解决后,去以上3帖6言,然后给予分数
有好想法的高手,请指教.
汉字拼音表(不考虑多音字,若有多音字按任一种取即可)
hzpy
字段: hz py
安 an
踏 ta
昂 ang
爱 ai
可 ke
视 shi
国 guo
者 zhe
达 da分类表 category
字段: name
adidas
安踏
昂达
爱可视
爱国者 需要对category表的name字段进行搜索排序,如果有中文,那么从汉字拼音表hzpy中,进行搜索汉字相应的拼音,取头字母,
如 安踏--at 安踏--at 昂达---ad 爱可视---aks 爱国者--agz ,然后把它们按照拼音排序,形成一张临时分类表
临时分类表 temp_table
字段: name py
adidas adidas
安踏 at
昂达 ad
爱可视 aks
爱国者 agz搜索排序后要得到排序后的结果为------- 昂达 adidas 爱国者 爱可视 安踏
初步设想为(要求在存储过程中实现)有一个得到某个词的拼音首字母的函数 first_letter()
搜索排序时,如果name为中文,则用first_letter()转化一下,扔进temp_table中,最后进行一个排序即可得到结果。大家一起来考虑一下这种方式可行性,或有谁有更好的方法,问T总分300分,,,,,,大家一起来学习,,,,
DELIMITER $$DROP PROCEDURE IF EXISTS `zz`.`hzpyhp`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `hzpyhp`()
BEGIN
select f1,group_concat(newpy order by f1,id SEPARATOR '') from (
select a.f1,b.id,mid(f1,b.id,1) as py,
func_get_first_letter(mid(f1,b.id,1)) as newpy
from ff a
left join lsb1 b on length(f1)>=b.id) aa
group by f1 order by 2;
END$$DELIMITER ;
words varchar(255)) RETURNS char(1) CHARSET utf8
BEGIN
declare fpy char(1);
declare pc char(1);
declare cc char(4);
set @fpy = UPPER(left(words,1));
set @pc = (CONVERT(@fpy USING gbk));
set @cc = hex(@pc);
if @cc >= "8140" and @cc <="FEA0" then
begin
select PY from cs_char2letter where hz>=@pc limit 1 into @fpy;
end;
end if;
Return @fpy;
END$$DELIMITER ;
('A','骜'),
('B','簿'),
('C','错'),
('D','鵽'),
('E','樲'),
('F','鳆'),
('G','腂'),
('H','夻'),
('J','攈'),
('K','穒'),
('L','鱳'),
('M','旀'),
('N','桛'),
('O','沤'),
('P','曝'),
('Q','囕'),
('R','鶸'),
('S','蜶'),
('T','箨'),
('W','鹜'),
('X','鑂'),
('Y','韵'),
('Z','咗');
`PY` char(1) character set utf8 NOT NULL,
`HZ` char(1) NOT NULL default '',
PRIMARY KEY (`PY`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk在MYSQL5.1下测试通过
这个是个偶然错误,就是我在一个数据库下用的测试时, 例如 “测试”返回的值为A,测试其他中文也为A,,,我全新建一个数据库只存放这一张表和函数时,测试“傻瓜”返回原值为正确的C,,,,,,可是我把这个数据库用Administrator备份回去在另一台机器上测试时,返回值为随意的值,其中“傻瓜”这个数据返回值为空,,,,,,,
因为这个不稳定的关系,所以才决定做一个汉字拼音表的,,,,也才有我的那个MySQL函数问T的, return_first,,,,
测试“傻瓜”返回原值为正确的C没有理解到是什么意思,检查一下字符集的设置,最好为UTF8
wwwwb,, 能不能给小弟解释一下这个存储过程啊,,,,后边能否加点注释,,,,,,这个对小弟来说太深奥了,刚学存储过程不久才,,,,,
func_get_first_letter(mid(f1,b.id,1)) as newpy
from ff a
left join lsb1 b on length(f1)>=b.id按字符长度分解字符串,即将ABC->A、B、C,根据单一字符查找汉字首字母,如非汉字,返回
原字母
select f1,group_concat(newpy order by f1,id SEPARATOR '')
将拆分并返回汉字首字母 OR 原字母的内容按照原字符分组,将分解的字母合并在一起,
可以分别运行一下查询就知道了。
ff ff.f1 ,,, lsb1 lsb1.id各是什么表与字段?小弟实在是,,,,,,,不好意思,没看明白,,,,,,
字段 name 下存储所有的分类信息,如 昂达 爱可视 爱国者 adidas 安踏 笔 芭比
,,,,把xyz表下的所有name按拼音进行排序,得到的结果为-----昂达 adidas 爱国者 爱可视 安踏 笔 芭比,,,
lsb1:临时表,只有ID字段,内容1-10000,数字型
->
FF->XYZ F1->NAME
lsb1:临时表,只有ID字段,内容1-10000,数字型