2010-06-10 2 views
2

Я делаю статистики работу, как это:, как повторно использовать подзапрос результат в MySQL

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 

является Simpified, реальные один довольно сложный запрос, , что я имею в виду, как повторно использовать этот вложенный выберите результат, если Я вычисляю cond1 и cond2.

+0

Что Вы отправили слишком абстрактно - дать более подробную информацию. К сожалению, MySQL не поддерживает предложение WITH ... –

ответ

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 

Опубликуйте структуру таблицы, если вы хотите, правильный запрос выписали :)

+0

Отлично! Это то, что я хочу!! – chris

+0

Без предложения where это делает полное сканирование таблицы, хотя. Если таблица огромна, вы можете быстрее добавить условия к условию «where condition1 OR condition2 OR ...» или просто использовать оператор UNION. – Konerak

Смежные вопросы