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

SQL 求助,如何同时搜索两列数据的多种情况?

  •  
  •   Richard14 · 2022-05-26 04:25:36 +08:00 · 1241 次点击
    这是一个创建于 695 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务上有一张表示对象分科目成绩的表,大概结构就是 主键自增 ID 、科目名,科目成绩,对象 ID 这四项,业务上搜索需要搜索,比如“搜索科目 1 成绩为 90,91,92,93,94,95 的所有对象 ID”

    SQL 目前是按下面这样写的

    SELECT objid FROM SCOTT.SCORES WHERE subject = 1 AND score IN (90,91,92,93,94,95) 
    

    但是遇到如果需要同时搜索不同科目的话,比如同时对科目 1 的成绩和科目 2 的成绩有要求,就需要拆成多个搜索语句,目前是这么写的

    SELECT DISTINCT objid FROM (
        SELECT objid FROM SCOTT.SCORES WHERE subject = 1 AND score IN (90,91,92,93,94,95)
        UNION
        SELECT objid FROM SCOTT.SCORES WHERE subject = 2 AND score IN (60,70,90)
        UNION
        SELECT objid FROM SCOTT.SCORES WHERE subject = 3 AND score IN (75,85)
    ) AS tmp
    

    感觉非常麻烦,请问有什么放到一句话里的写法吗?

    目前是在表里针对 subject 的值进行了分区,然后对 subject 和 score 建立了一个联合的普通索引,性能上还有能优化的地方吗?谢谢大家

    2 条回复    2022-05-26 10:24:44 +08:00
    tuutoo
        1
    tuutoo  
       2022-05-26 06:23:15 +08:00 via Android   ❤️ 1
    where (subject = 1 AND score IN (90,91,92,93,94,95))
    or
    (subject = 2 AND score IN (60,70,90))
    or
    (subject = 3 AND score IN (75,85))
    onhao
        2
    onhao  
       2022-05-26 10:24:44 +08:00   ❤️ 1
    可以用 group_concat ,把满足条件的做标记,然后再通过对应的标记做分组 https://wuhao.pw/archives/161/
    @ Richard14
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2184 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:33 · PVG 08:33 · LAX 17:33 · JFK 20:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.