Группировка данных из нескольких таблиц - PullRequest
1 голос
/ 12 августа 2009

у меня 4 таблицы на каждый месяц; окт, декабрь, февраль, апр. Они имеют одинаковую схему.

Мне нужно извлечь данные из всех таблиц, используя один и тот же запрос, и сгруппировать их по одному атрибуту.

Я знаю, как это сделать для одной таблицы, но я хотел бы объединить результаты в один запрос, а затем вывести вывод в файл.

Вот мой пример запроса:

select TIMESTAMPDIFF(hour,startTime,endTime) as duration, count(*) from feb 
where type='gen' group by duration 
into outfile "/feb";

Так как я группирую это для атрибута duration, я в итоге получаю 4 разных выходных файла, а затем я хочу избежать слияния и явной сортировки данных.

Любая помощь будет оценена!

Омер

Ответы [ 2 ]

3 голосов
/ 12 августа 2009

Вы можете использовать UNION:

select TIMESTAMPDIFF(hour,startTime,endTime) as duration, count(*) from feb 
where type='gen' group by duration 
UNION
select TIMESTAMPDIFF(hour,startTime,endTime) as duration, count(*) from apr
where type='gen' group by duration 
UNION
select TIMESTAMPDIFF(hour,startTime,endTime) as duration, count(*) from oct 
where type='gen' group by duration 
UNION
select TIMESTAMPDIFF(hour,startTime,endTime) as duration, count(*) from dec 
where type='gen' group by duration 
into outfile "/all";

Обратите внимание, что вы используете выражение INFO OUTFILE только в самом конце, а не в каждом SELECT выражении.

2 голосов
/ 12 августа 2009

Используйте UNION ALL. Он предлагает лучшую производительность, чем UNION, и в любом случае было бы неправильно удалять дубликаты в этом случае. Вы также можете выполнить GROUP BY после объединения всех таблиц, чтобы можно было сгруппировать строки по таблицам. Это даст вам количество строк с одинаковой длительностью, суммированных во всех 4 таблицах.

select everything.duration, count(*)
from
((select TIMESTAMPDIFF(hour,startTime,endTime) as duration
  from feb where type='gen')
 union all
 (select TIMESTAMPDIFF(hour,startTime,endTime) as duration
  from apr where type='gen')
 union all
 (select TIMESTAMPDIFF(hour,startTime,endTime) as duration
  from oct where type='gen')
 union all
 (select TIMESTAMPDIFF(hour,startTime,endTime) as duration
  from dec where type='gen')) everything
group by everything.duration
into outfile "/all";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...