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

如何在mysql中重用子查询结果,mysql,select,performance,nested,subquery,Mysql,Select,Performance,Nested,Subquery,我在做这样的统计工作: SUM |COND1 |COND2 |... -------------------------- 100 |80 | 70 |... 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 fr

我在做这样的统计工作:

SUM    |COND1 |COND2 |...
--------------------------
100    |80    | 70   |...
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
求和结果是从多个表中计算出来的,条件是这些表的子集

我写了这样一个sql:

SUM    |COND1 |COND2 |...
--------------------------
100    |80    | 70   |...
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时,如何重用这个嵌套的select结果。

您应该尝试重写查询,以便只在一次表扫描中完成所有操作。使用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

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

您发布的内容过于抽象-请提供更多详细信息。遗憾的是,MySQL不支持WITH子句…太好了!!这就是我想要的!!如果没有where子句,这将执行完整的表扫描。如果表很大,则可以更快地将条件添加到“where condition1或condition2或…”,或者只使用UNION语句。