私はこのように複数の列から値を数えます:
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を使用しています。
データのコンテキスト/構造を理解せずにあなたを助ける方法を知ることは難しいですが、私はこれがあなたを助けるかもしれないと信じています:
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
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
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
使用しているデータベースサーバーについては説明しませんでしたが、一時テーブルが利用可能な場合は、最善の方法かもしれません。
// 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
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