0

请告知如何最好地优化此查询。

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 中做到这一点?

4

2 回答 2

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    
)

您经常会发现单独的查询胜过单个基于“或”的查询,因为“或”的每个部分都可以使用自己的(最佳)索引。

于 2013-06-11T14:37:14.243 回答
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
于 2013-06-11T14:43:00.233 回答