V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Braid
V2EX  ›  程序员

请教一个 mysql 中文排序的问题,就是某一列是有“高”、“中”、“低”三种值,然后我怎么才能 orderby 出高中低的效果?

  •  
  •   Braid · 2017-03-28 16:11:02 +08:00 · 2957 次点击
    这是一个创建于 2578 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教一个 mysql 中文排序的问题,就是某一列是有“高”、“中”、“低”三种值,然后我怎么才能 orderby 出高中低的效果?目前使用 CONVERT( FieldName USING gbk ) COLLATE gbk_chinese_ci desc 排序结果是高低中。。。求 v2 大牛知道
    16 条回复    2017-03-29 09:17:32 +08:00
    cye3s
        1
    cye3s  
       2017-03-28 16:19:56 +08:00   ❤️ 3
    oracle 我知道, order by decode ,然后搜索到 MySQL 的, ORDER BY FIND_IN_SET(FieldName,"高,中,低")
    Braid
        2
    Braid  
    OP
       2017-03-28 16:30:04 +08:00
    @cye3s 可以。感谢!
    debye
        3
    debye  
       2017-03-28 16:35:10 +08:00
    可以是可以,但是您这个数据库设计是不是有点问题
    Reign
        4
    Reign  
       2017-03-28 16:46:28 +08:00   ❤️ 1
    这个数据库设计得真让人呕心沥血,新建一个字段啊, tinyint , 3 、 2 、 1 代表对应的三个值,写个脚本替换到这个字段就行了呗
    qiayue
        5
    qiayue  
       2017-03-28 17:00:57 +08:00
    为了程序快,增加一个字段,再加上索引
    Braid
        6
    Braid  
    OP
       2017-03-28 17:10:02 +08:00
    @Reign 我是接锅虾,新建的话要改的地方目测会很多,懒~
    flyingghost
        7
    flyingghost  
       2017-03-28 17:10:31 +08:00
    select * from user where bigger='高'
    union
    select * from user where bigger='中'
    union
    select * from user where bigger='低'
    Braid
        8
    Braid  
    OP
       2017-03-28 17:14:26 +08:00
    @flyingghost 你这个方法也可以。。。赞一个
    cncqw
        9
    cncqw  
       2017-03-28 17:27:19 +08:00
    @Braid 这也叫可以?明明只需要查一次结果被你查了 3 次
    magicdawn
        10
    magicdawn  
       2017-03-28 17:51:44 +08:00
    select case
    when col = '高' then 3
    when col = '中' then 2
    when col = '低' then 1
    end as priority
    from ...
    order by priority desc
    ApizzaTeam
        11
    ApizzaTeam  
       2017-03-28 18:02:49 +08:00
    @Reign 确实应该这样,数据库设计的问题
    kevinzhwl
        12
    kevinzhwl  
       2017-03-28 19:40:57 +08:00
    邪路:统一变成“ 10 高”,“ 20 中”,“ 30 低”
    flniu
        13
    flniu  
       2017-03-28 20:25:41 +08:00
    @Braid 而且 union 不保证结果顺序,顺序这次符合你的预期只是巧合。
    flniu
        14
    flniu  
       2017-03-28 20:28:19 +08:00
    1 楼的方案是奇技淫巧,不改变现有数据模型的临时方案可以用这个。
    长期的方案是把字段改成有序的数值类型或枚举类型。
    Mitt
        15
    Mitt  
       2017-03-29 03:03:12 +08:00
    10L 的方法 +1
    nikubenki
        16
    nikubenki  
       2017-03-29 09:17:32 +08:00
    DELIMITER $$

    USE `数据库名`$$

    DROP FUNCTION IF EXISTS `my_translate`$$

    CREATE DEFINER=`root`@`%` FUNCTION `my_translate`(param VARCHAR(100)) RETURNS VARCHAR(100) CHARSET utf8
    BEGIN
    SET param = REPLACE(param,'低','a');
    SET param = REPLACE(param,'中','b');
    SET param = REPLACE(param,'高','c');
    RETURN param;
    END$$

    DELIMITER ;


    然后 order by 这个 function 返回值?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1093 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:58 · PVG 06:58 · LAX 15:58 · JFK 18:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.