MySQL 如何高效实现多条件查询,根据查询条件满足次数排序? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
CathayChen
V2EX    MySQL

MySQL 如何高效实现多条件查询,根据查询条件满足次数排序?

  •  
  •   CathayChen 2021-10-28 09:27:17 +08:00 2769 次点击
    这是一个创建于 1479 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有这么一个需求,查询满足多条件的数据,条件会有很多,满足条件的次数越多排序越靠前,怎么实现呢?

    最好的情况是满足不同条件有不同的匹配分,满足条件的匹配分越高越靠前,目前能想到的方案通过在 select 里通过 if 判断是否满足给某个字段+分,这样感觉效率会很低,有没有更好的方案呢?

    15 条回复    2021-10-29 11:10:30 +08:00
    7Qi7Qi
        1
    7Qi7Qi  
       2021-10-28 09:52:20 +08:00
    case when .... then weight1 else 0 end + case when .... then weight2 else 0 end ....
    这样?
    CathayChen
        2
    CathayChen  
    OP
       2021-10-28 09:54:19 +08:00
    @7Qi7Qi 这样效率会不会很低,目前是准备这样做的
    JKeita
        3
    JKeita  
       2021-10-28 10:07:56 +08:00
    这种不是应该上 es 吗
    shanghai1943
        4
    shanghai1943  
       2021-10-28 10:15:14 +08:00
    莫非每个条件都查一次,然后在结果里计算出现的次数?这个听起来用 MySQL 实现有点复杂。
    CathayChen
        5
    CathayChen  
    OP
       2021-10-28 10:15:31 +08:00
    @JKeita 没毛病,不能为了一个小需求就上 es 吧
    micean
        6
    micean  
       2021-10-28 10:15:37 +08:00
    如果不用 es 的话,自己来做一个索引表,按权重计算汇总一个数字用于排序,按及时性要求来设计全量或增量更新
    debuggerx
        7
    debuggerx  
       2021-10-28 10:20:06 +08:00
    https://stackoverflow.com/questions/3333665/rank-function-in-mysql

    这样的需求直接用 mysql 应该是避免不了全表扫描,效率高不到哪去的
    JKeita
        8
    JKeita  
       2021-10-28 10:39:56 +08:00
    @CathayChen 这要看你这需求的使用频率吧,如果很频繁完全可以上 es
    thetbw
        9
    thetbw  
       2021-10-28 10:47:19 +08:00   2
    @CathayChen 既然是小需求,就干脆砍了吧,给领导说做不了
    yuanshuai1995
        10
    yuanshuai1995  
       2021-10-28 10:49:17 +08:00
    @thetbw #9 没毛病 哈哈哈哈
    chenjiangui998
        11
    chenjiangui998  
       2021-10-28 13:07:34 +08:00
    全表查出来, 代码排序
    ipwx
        12
    ipwx  
       202110-28 13:12:21 +08:00
    你这需求是典型的全文检索算法的需求。

    对,就是让你上 ES 。
    fengpan567
        13
    fengpan567  
       2021-10-28 13:50:57 +08:00
    整不了
    fxxkgw
        14
    fxxkgw  
       2021-10-28 14:27:47 +08:00
    我是看了好多遍美团技术团队的这篇文章,感觉很受用。

    https://tech.meituan.com/2014/06/30/mysql-index.html
    SonivelY
        15
    SonivelY  
       2021-10-29 11:10:30 +08:00
    不想用 ES 的话,试试更加轻量的 mysql ngram
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2573 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 05:30 PVG 13:30 LAX 21:30 JFK 00:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86