V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nolog
V2EX  ›  数据库

一个 SQL 问题

  •  
  •   nolog · 2024-01-25 16:09:14 +08:00 · 2026 次点击
    这是一个创建于 371 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个张用户表,现有一个需求,查询用户列表并需要将某些用户排序在前面: 排序:将名字中含有狮、将、鄢、金、香、道、泉、吉、玉、军、光、鄂、孝、木、孝、夏、凤、磁、都的用户排在前面

    请教各位大佬这个怎么实现。

    24 条回复    2024-04-02 13:19:50 +08:00
    ysnow888
        1
    ysnow888  
       2024-01-25 16:14:10 +08:00
    写入的时候加个排序值吧
    fisherman0459
        2
    fisherman0459  
       2024-01-25 16:18:17 +08:00
    order by field
    Fa11ingWood
        3
    Fa11ingWood  
       2024-01-25 16:20:48 +08:00
    加个 rank 或者 level
    nolog
        4
    nolog  
    OP
       2024-01-25 16:27:01 +08:00
    @Fa11ingWood
    问了 gpt ,说是通过 ORDER BY CASE WHEN name LIKE '%狮%' OR name LIKE '%将%' THEN 0 ELSE 1 这样来实现
    coolfly1
        5
    coolfly1  
       2024-01-25 16:27:47 +08:00
    SELECT * FROM 用户表
    ORDER BY
    CASE
    WHEN 名字 LIKE '%狮%' THEN 1
    WHEN 名字 LIKE '%将%' THEN 2
    WHEN 名字 LIKE '%鄢%' THEN 3
    WHEN 名字 LIKE '%金%' THEN 4
    WHEN 名字 LIKE '%香%' THEN 5
    WHEN 名字 LIKE '%道%' THEN 6
    WHEN 名字 LIKE '%泉%' THEN 7
    WHEN 名字 LIKE '%吉%' THEN 8
    WHEN 名字 LIKE '%玉%' THEN 9
    WHEN 名字 LIKE '%军%' THEN 10
    WHEN 名字 LIKE '%光%' THEN 11
    WHEN 名字 LIKE '%鄂%' THEN 12
    WHEN 名字 LIKE '%孝%' THEN 13
    WHEN 名字 LIKE '%木%' THEN 14
    WHEN 名字 LIKE '%夏%' THEN 15
    WHEN 名字 LIKE '%凤%' THEN 16
    WHEN 名字 LIKE '%磁%' THEN 17
    WHEN 名字 LIKE '%都%' THEN 18
    ELSE 19
    END;

    只不过这种写法性能可能不太好,可以考虑先查结果,然后在程序里返回前排序
    coinbase
        6
    coinbase  
       2024-01-25 16:32:03 +08:00
    SELECT *
    FROM users
    ORDER BY
    CASE
    WHEN name LIKE '%狮%' THEN 1
    WHEN name LIKE '%将%' THEN 1
    WHEN name LIKE '%鄢%' THEN 1
    WHEN name LIKE '%金%' THEN 1
    WHEN name LIKE '%香%' THEN 1
    WHEN name LIKE '%道%' THEN 1
    WHEN name LIKE '%泉%' THEN 1
    WHEN name LIKE '%吉%' THEN 1
    WHEN name LIKE '%玉%' THEN 1
    WHEN name LIKE '%军%' THEN 1
    WHEN name LIKE '%光%' THEN 1
    WHEN name LIKE '%鄂%' THEN 1
    WHEN name LIKE '%孝%' THEN 1
    WHEN name LIKE '%木%' THEN 1
    WHEN name LIKE '%夏%' THEN 1
    WHEN name LIKE '%凤%' THEN 1
    WHEN name LIKE '%磁%' THEN 1
    WHEN name LIKE '%都%' THEN 1
    ELSE 2
    END,
    name;
    ChoateYao
        7
    ChoateYao  
       2024-01-25 17:06:30 +08:00
    能不能清洗数据,能的话加个字段用于排序。

    不能的话,按照楼上的做,性能不能保证。
    nolog
        8
    nolog  
    OP
       2024-01-25 17:10:14 +08:00
    @ysnow888
    嗯,感觉这个合理
    asmoker
        9
    asmoker  
       2024-01-25 18:05:51 +08:00
    有意思,想了解下需求原因?😄
    zhuoyue100
        10
    zhuoyue100  
       2024-01-25 18:16:48 +08:00
    你这不得加一个整型字段来做排序吗? 整型字段做一下映射排序值, 不然你光靠这几个没有规则的字怎么排序
    aw2350
        11
    aw2350  
       2024-01-25 18:16:56 +08:00
    这些是领导??
    lstz
        12
    lstz  
       2024-01-25 18:18:34 +08:00 via Android
    case when 解君愁,不过性能会比较差些罢了
    lkkl007
        13
    lkkl007  
       2024-01-25 18:32:50 +08:00
    什么吊需求都有
    yuhuai
        14
    yuhuai  
       2024-01-25 18:42:48 +08:00
    这不合适,我和 3 楼看法一致,加字段,你不能以后每次多一个新规则就该一次 sql 或程序
    yuhuai
        15
    yuhuai  
       2024-01-25 18:47:07 +08:00
    如果非要实现这种扭曲的需求,需要一个灵活的全局系统参数,新增用户时,通过参数的值判断是否包含某些字,给他排序字段赋值最高优先级
    txzh007
        16
    txzh007  
       2024-01-25 19:29:32 +08:00
    加字段把 搞个 sort 值,不然你这个排序的字不是固定的 那 gg
    dyv9
        17
    dyv9  
       2024-01-26 07:34:14 +08:00 via Android
    GPT 给的已经是好的方案了。性能不算差,想更快就需要动表结构。
    andykuen959595
        18
    andykuen959595  
       2024-01-26 09:40:31 +08:00
    最好加字段,然后再排序!主要看表的数量有多少,考虑性能!
    nolog
        19
    nolog  
    OP
       2024-01-26 09:59:27 +08:00 via Android
    @asmoker 产品提的需求。
    nolog
        20
    nolog  
    OP
       2024-01-26 10:00:23 +08:00 via Android
    @zhuoyue100 嗯,加排序字段了,但是就怕产品又改规则。
    Habyss
        21
    Habyss  
       2024-01-26 11:49:48 +08:00
    先搞定这个需求, 加 sort 字段, 然后根据规则初始化跑一下, 后续新增数据根据规则设置 sort

    如果之后这个规则要改的话, 就是另一个需求了, 规则可配置...
    到时候再想方案呗, 就把规则抽出来搞个 mapping, xxx-1,sss-2, 根据配置规则映射 sort,
    langhuishan
        22
    langhuishan  
       2024-01-26 12:52:42 +08:00
    @aw2350 年终奖抽检,大奖给领导
    dyv9
        23
    dyv9  
       306 天前 via Android
    @asmoker 算命的游戏嘛。
    nolog
        24
    nolog  
    OP
       303 天前
    @dyv9 #23 不是,就是普通 to b 业务系统需求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1067 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:57 · PVG 00:57 · LAX 08:57 · JFK 11:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.