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

3
我正在进行类似于这样的统计工作:

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

SUM结果是从多个表中计算出来的,而CONDS是其子集。

我编写了如下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时重用这个嵌套查询的结果。


你发布的内容太抽象了 - 给出更多细节。不幸的是,MySQL不支持WITH子句... - OMG Ponies
1个回答

4

你应该尝试重写查询,只使用一次表扫描即可完成。使用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

如果您想要得到正确的查询语句,请发布您的表结构 :)

太好了!这就是我想要的! - chris
没有where子句,这将执行完整的表扫描。如果表很大,您可以更快地将条件添加到“where condition1 OR condition2 OR ...”中,或者只使用UNION语句。 - Konerak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接