如何在mysql中重用子查询结果

时间:2010-06-10 14:24:03

标签: mysql select performance nested subquery

我正在做这样的统计工作:

SUM    |COND1 |COND2 |...
--------------------------
100    |80    | 70   |...

SUM结果是从多个表计算的,COND是其中的子集。

我写了一个像这样的SQL:

select tmp1.id,sum,cond1,cond2  from (
   select id, count(*) as sum from table1 
   group by table1.id) tmp1
 left join ( 
   select id, count(*) as cond1 from table1
   where condition1
   group by table1.id) tmp2 on tmp1.id=tmp2.id
 left join ( 
   select id, count(*) as cond2 from table1
   where condition2
   group by table1.id) tmp3 on tmp1.id=tmp3.id

问题是效率非常低,如果我可以使用tmp1的结果会更好,但我不知道该怎么做。

更新:简化了sql, 在这种情况下的第一个子查询:

select id, count(*) as sum from table1 
   group by table1.id) tmp1

简化,真实的是一个相当复杂的查询, 我的意思是当我计算cond1和cond2时如何重用这个嵌套的选择结果。

1 个答案:

答案 0 :(得分:3)

您应该尝试重写查询,只在一次表扫描中完成所有操作。使用IF语句:

SELECT id, 
COUNT(*) AS sum, 
SUM( IF( condition1 , 1, 0 ) ) cond1, -- emulates a count where condition1
SUM( IF( condition2, 1, 0 ) ) cond2   -- same thing, for condition2
FROM table1
GROUP BY id

如果要写出正确的查询,请发布表结构:)