Подтвердить что ты не робот

Считайте несколько столбцов с группой по одному запросу

Я подсчитываю значения из нескольких столбцов, например:

SELECT COUNT(column1),column1 FROM table GROUP BY column1
SELECT COUNT(column2),column2 FROM table GROUP BY column2
SELECT COUNT(column3),column3 FROM table GROUP BY column3

Это возвращает, например, для массива column1 (attr1 = > 2000, attr2 = > 3000...) (Каждый столбец имеет конкретные и несколько значений). Проблема в том, что "таблица" в моем приложении может быть запросом с некоторыми объединениями и где клаузулы, которые могут занимать 0,1 сек. Выполняя все, что считается, "таблица" вычисляется каждый раз снова, что не является необходимым. Есть ли способ получить результаты, которые я хочу с помощью одного запроса, или "кеш" запроса, который создает таблицу? В противном случае я считаю, что денормализация будет единственным решением здесь. И я хочу получить те же результаты с вышеуказанными запросами. Я использую mysql-myisam.

4b9b3361

Ответ 1

Трудно знать, как помочь вам, не понимая контекста/структуры ваших данных, но я считаю, что это может вам помочь:

SELECT 
     SUM(CASE WHEN column1 IS NOT NULL THEN 1 ELSE 0 END) AS column1_count
    ,SUM(CASE WHEN column2 IS NOT NULL THEN 1 ELSE 0 END) AS column2_count
    ,SUM(CASE WHEN column3 IS NOT NULL THEN 1 ELSE 0 END) AS column3_count
FROM table

Ответ 2

Одним из решений является обернуть его в подзапрос

SELECT *
FROM
(
    SELECT COUNT(column1),column1 FROM table GROUP BY column1
    UNION ALL
    SELECT COUNT(column2),column2 FROM table GROUP BY column2
    UNION ALL
    SELECT COUNT(column3),column3 FROM table GROUP BY column3
) s

Ответ 3

select tab1.name,
count(distinct tab2.id) as tab2_record_count
count(distinct tab3.id) as tab3_record_count
count(distinct tab4.id) as tab4_record_count
from tab1
left join tab2 on tab2.tab1_id = tab1.id
left join tab3 on tab3.tab1_id = tab1.id
left join tab4 on tab4.tab1_id = tab1.id

Ответ 4

Вы не сказали, какой сервер баз данных вы используете, но если доступны временные таблицы, они могут быть лучшим подходом.

// table is a temp table
select ... into #table ....
SELECT COUNT(column1),column1 FROM #table GROUP BY column1  
SELECT COUNT(column2),column2 FROM #table GROUP BY column2  
SELECT COUNT(column3),column3 FROM #table GROUP BY column3  
// drop may not be required
drop table #table

Ответ 5

    SELECT SUM(Output.count),Output.attr 
FROM
(
    SELECT COUNT(column1  ) AS count,column1 AS attr FROM tab1 GROUP BY column1 
    UNION ALL
    SELECT COUNT(column2) AS count,column2 AS attr FROM tab1 GROUP BY column2
    UNION ALL
    SELECT COUNT(column3) AS count,column3 AS attr FROM tab1 GROUP BY column3) AS Output

    GROUP BY attr