请告知如何最好地优化此查询。
select count(*)
from table1
where field1 in (select `text` from table2 where id=2)
or field2 in (select `text` from table2 where id=2)
or field3 in (select `text` from table2 where id=2);
我的第一个想法是将内部查询的结果选择为逗号分隔值,然后在IN子句中使用csv中的结果。但有没有办法在SQL中完全执行此操作?
答案 0 :(得分:3)
尝试转换为正确的联接并反转您的表格顺序,以便where id = 2
条件可以获得一些牵引力,并使用union
将OR
拆分为可能允许索引的单独查询使用:
select count(distinct id) from (
select t.id
from table2 t2
join table1 t on t.field1 = t2.`text`
where t2.id=2
union
select t.id
from grouplists t2
join table1 t on t.field2 = t2.`text`
where t2.id=2
union
select t.id
from grouplists t2
join table1 t on t.field3 = t2.`text`
where t2.id=2
)
您经常会发现单独的查询超出单个“或”基础的查询,因为“或”的每个部分都可以使用自己的(最佳)索引。
答案 1 :(得分:1)
我喜欢波希米亚的答案,但我认为这也可以作为另一种选择
SELECT COUNT(DISTINCT table1.id)
FROM table1
LEFT JOIN table2 ON table2.text = table1.field1
AND table2.id=2
LEFT JOIN grouplists g1 ON g1.text = table1.field2
AND g1.id=2
LEFT JOIN grouplists g2 ON g2.text = table1.field3
AND g2.id=2
WHERE COALESCE(table2.id, g1.id, g2.id) IS NOT NULL