至于一些网友可能说用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分,,,,,,大家一起来学习,,,,

解决方案 »

  1.   

    原来的代码就可以:
    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 ;
      

  2.   

    DELIMITER $$DROP FUNCTION IF EXISTS `zz`.`func_get_first_letter`$$CREATE DEFINER=`root`@`localhost` FUNCTION `func_get_first_letter`(
     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 ;
      

  3.   

    insert into cs_char2letter values
    ('A','骜'),
    ('B','簿'),
    ('C','错'),
    ('D','鵽'),
    ('E','樲'),
    ('F','鳆'),
    ('G','腂'),
    ('H','夻'),
    ('J','攈'),
    ('K','穒'),
    ('L','鱳'),
    ('M','旀'),
    ('N','桛'),
    ('O','沤'),
    ('P','曝'),
    ('Q','囕'),
    ('R','鶸'),
    ('S','蜶'),
    ('T','箨'),
    ('W','鹜'),
    ('X','鑂'),
    ('Y','韵'),
    ('Z','咗');
      

  4.   

    cs_char2letter  CREATE TABLE `cs_char2letter` (             
                      `PY` char(1) character set utf8 NOT NULL, 
                      `HZ` char(1) NOT NULL default '',         
                      PRIMARY KEY  (`PY`)                       
                    ) ENGINE=InnoDB DEFAULT CHARSET=gbk在MYSQL5.1下测试通过
      

  5.   

    这个我昨天用的时候出现错误,,,,返回的值不正确,,,,,版本5.0.67-community-nt  
      

  6.   


    这个是个偶然错误,就是我在一个数据库下用的测试时, 例如 “测试”返回的值为A,测试其他中文也为A,,,我全新建一个数据库只存放这一张表和函数时,测试“傻瓜”返回原值为正确的C,,,,,,可是我把这个数据库用Administrator备份回去在另一台机器上测试时,返回值为随意的值,其中“傻瓜”这个数据返回值为空,,,,,,,
    因为这个不稳定的关系,所以才决定做一个汉字拼音表的,,,,也才有我的那个MySQL函数问T的,  return_first,,,,
      

  7.   

    例如 “测试”返回的值为A,测试其他中文也为A,,, 
    测试“傻瓜”返回原值为正确的C没有理解到是什么意思,检查一下字符集的设置,最好为UTF8
      

  8.   

    我改了一下,      cs_char2letter   汉字字段的 编码为 gbk后,正确,,,,,,,测试正常,,,,,,先谢谢,,,,,,
      

  9.   


    wwwwb,, 能不能给小弟解释一下这个存储过程啊,,,,后边能否加点注释,,,,,,这个对小弟来说太深奥了,刚学存储过程不久才,,,,, 
      

  10.   

    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按字符长度分解字符串,即将ABC->A、B、C,根据单一字符查找汉字首字母,如非汉字,返回
    原字母
    select f1,group_concat(newpy order by f1,id SEPARATOR '')
    将拆分并返回汉字首字母 OR 原字母的内容按照原字符分组,将分解的字母合并在一起,
    可以分别运行一下查询就知道了。
      

  11.   


    ff   ff.f1    ,,,     lsb1    lsb1.id各是什么表与字段?小弟实在是,,,,,,,不好意思,没看明白,,,,,,
      

  12.   

    我要搜索排序的 表为 xyz 
            字段 name  下存储所有的分类信息,如  昂达 爱可视 爱国者 adidas 安踏  笔 芭比
      
    ,,,,把xyz表下的所有name按拼音进行排序,得到的结果为-----昂达  adidas  爱国者 爱可视 安踏 笔 芭比,,,
      

  13.   

    ff:工作表 只有一个字段F1,即你要排序的字段
    lsb1:临时表,只有ID字段,内容1-10000,数字型
      

  14.   

    ff:工作表 只有一个字段F1,即你要排序的字段
    ->  
    FF->XYZ  F1->NAME
    lsb1:临时表,只有ID字段,内容1-10000,数字型