MYSQL Вывод двух селектов в одну таблицу

282
30 марта 2017, 19:58

Помогите, пожалуйста, не могу объединить два запроса в один. Каждый из них выводит строчку с нужными данными по итогу. А хочется в одну табличку из двух строчек. UNION не работает:

Первый:

select s_n_name, count(duration) as 'Количество', SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as 'Время'
from table where s_n='001111';

Второй:

select s_n_name, count(duration) as 'Количество', SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as 'Время'
from table where s_n='002222';
Answer 1

Группировка вас спасёт:

SELECT s_n_name, COUNT(*) n, SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as t
FROM _table
WHERE s_n IN('001111', '002222')
GROUP BY s_n;

Для отладки использовал такую временную таблицу:

CREATE TEMPORARY TABLE _table(s_n char(6), s_n_name char(14), duration TIME)
  SELECT '001111' s_n, 'name is 001111' s_n_name, '00:11:11' duration UNION ALL
  SELECT '001111' s_n, 'name is 001111' s_n_name, '00:11:11' duration UNION ALL
  SELECT '001111' s_n, 'name is 001111' s_n_name, '00:11:11' duration UNION ALL
  SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
  SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
  SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
  SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
  SELECT '003333' s_n, 'name is 003333' s_n_name, '00:33:33' duration UNION ALL
  SELECT '003333' s_n, 'name is 003333' s_n_name, '00:33:33' duration;

Можно использовать union (я не понял, что там в нём у вас не работает), но это ад!

SELECT s_n_name, COUNT(*) n, SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as t
FROM _table
WHERE s_n = '001111'
UNION
SELECT s_n_name, COUNT(*) n, SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as t
FROM _table
WHERE s_n = '002222';
Answer 2

Можно воспользоваться оператором IN в WHERE, сгруппировав результаты по ключу:

select s_n_name, 
    count(duration) as cnt,
    SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as `time`
from table where s_n IN ('001111', '002222')
group by s_n, s_n_name;  

Либо OR, если нужны строго 2 результата:

select s_n_name, 
    count(duration) as cnt_dur,
    SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as secs
from table where s_n='001111' OR s_n='002222'
group by s_n, s_n_name;   

Группировка нужна, чтобы переопределить константную группировку аггрегатной функции COUNT - без кастомной группировки результатом запроса всегда будет одна строка

Если нужно объединить результаты двух абстрактных запросов(более сложные условия) с одинаковой сигнатурой, воспользуйтесь union all:

select s_n_name, 
    count(duration) as cnt,
    SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as secs
from table where s_n='001111'
UNION ALL
select s_n_name, 
    count(duration) as cnt,
    SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as secs
from table where s_n='002222';   
READ ALSO
TRANSACTION ISOLATION LEVEL в хранимой процедуре mysql

TRANSACTION ISOLATION LEVEL в хранимой процедуре mysql

Для MS SQL есть возможность установки TRANSACTION ISOLATION LEVEL в хранимых процедурахНапример:

226
Deadlock в MySQL: анализ engine.log

Deadlock в MySQL: анализ engine.log

Как понять причину deadlock'а - а именно, какие транзакции захватили какие блокировки?

320
Обработка потока/перехват данных

Обработка потока/перехват данных

Хочу добиться интерактивного взаимодействия с командной строкойДля этого использовал найденный в интернете класс SyncPipe

205