业务上有一张表示对象分科目成绩的表,大概结构就是 主键自增 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 建立了一个联合的普通索引,性能上还有能优化的地方吗?谢谢大家
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)) |
2
onhao 2022-05-26 10:24:44 +08:00 1
可以用 group_concat ,把满足条件的做标记,然后再通过对应的标记做分组 https://wuhao.pw/archives/161/
@ Richard14 |