V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Braid
V2EX  ›  程序员

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

  •  
  •   Braid · Mar 28, 2017 · 3733 views
    This topic created in 3327 days ago, the information mentioned may be changed or developed.
    请教一个 mysql 中文排序的问题,就是某一列是有“高”、“中”、“低”三种值,然后我怎么才能 orderby 出高中低的效果?目前使用 CONVERT( FieldName USING gbk ) COLLATE gbk_chinese_ci desc 排序结果是高低中。。。求 v2 大牛知道
    16 replies    2017-03-29 09:17:32 +08:00
    cye3s
        1
    cye3s  
       Mar 28, 2017   ❤️ 3
    oracle 我知道, order by decode ,然后搜索到 MySQL 的, ORDER BY FIND_IN_SET(FieldName,"高,中,低")
    Braid
        2
    Braid  
    OP
       Mar 28, 2017
    @cye3s 可以。感谢!
    debye
        3
    debye  
       Mar 28, 2017
    可以是可以,但是您这个数据库设计是不是有点问题
    Reign
        4
    Reign  
       Mar 28, 2017   ❤️ 1
    这个数据库设计得真让人呕心沥血,新建一个字段啊, tinyint , 3 、 2 、 1 代表对应的三个值,写个脚本替换到这个字段就行了呗
    qiayue
        5
    qiayue  
    PRO
       Mar 28, 2017
    为了程序快,增加一个字段,再加上索引
    Braid
        6
    Braid  
    OP
       Mar 28, 2017
    @Reign 我是接锅虾,新建的话要改的地方目测会很多,懒~
    flyingghost
        7
    flyingghost  
       Mar 28, 2017
    select * from user where bigger='高'
    union
    select * from user where bigger='中'
    union
    select * from user where bigger='低'
    Braid
        8
    Braid  
    OP
       Mar 28, 2017
    @flyingghost 你这个方法也可以。。。赞一个
    cncqw
        9
    cncqw  
       Mar 28, 2017
    @Braid 这也叫可以?明明只需要查一次结果被你查了 3 次
    magicdawn
        10
    magicdawn  
       Mar 28, 2017
    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  
       Mar 28, 2017
    @Reign 确实应该这样,数据库设计的问题
    kevinzhwl
        12
    kevinzhwl  
       Mar 28, 2017
    邪路:统一变成“ 10 高”,“ 20 中”,“ 30 低”
    flniu
        13
    flniu  
       Mar 28, 2017
    @Braid 而且 union 不保证结果顺序,顺序这次符合你的预期只是巧合。
    flniu
        14
    flniu  
       Mar 28, 2017
    1 楼的方案是奇技淫巧,不改变现有数据模型的临时方案可以用这个。
    长期的方案是把字段改成有序的数值类型或枚举类型。
    Mitt
        15
    Mitt  
       Mar 29, 2017
    10L 的方法 +1
    nikubenki
        16
    nikubenki  
       Mar 29, 2017
    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 返回值?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3730 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 1042ms · UTC 00:40 · PVG 08:40 · LAX 17:40 · JFK 20:40
    ♥ Do have faith in what you're doing.