web-dev-qa-db-ja.com

1つのクエリでgroup byを使用して複数の列をカウントする

私はこのように複数の列から値を数えます:

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 array(attr1 => 2000、attr2 => 3000 ...)(各列には特定の値がほとんどありません)を返します。問題は、私のアプリケーションの「テーブル」がいくつかの結合とwhere句を含むクエリになり、0.1秒かかることがあることです。カウントをすべて行うことで、「テーブル」が毎回計算されますが、これは必要ありません。 1つのクエリで必要な結果を取得する方法、またはテーブルを生成するクエリを「キャッシュする」方法はありますか?そうでなければ、ここで非正規化が唯一の解決策になると思います。上記のクエリでも同じ結果が必要です。私はmysql-myisamを使用しています。

28
user666

データのコンテキスト/構造を理解せずにあなたを助ける方法を知ることは難しいですが、私はこれがあなたを助けるかもしれないと信じています:

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
41
coge.soft

1つの解決策は、サブクエリでラップすることです

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
8
John Woo
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
3
Rajesh Paul

使用しているデータベースサーバーについては説明しませんでしたが、一時テーブルが利用可能な場合は、最善の方法かもしれません。

// 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
1
    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 
0
Mohsen Bandamir