33

次のように複数の列から値を数えます。

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を使用しています。

4

6 に答える 6

51

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

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
于 2012-11-02T15:26:20.623 に答える
9

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
于 2012-10-02T15:15:04.613 に答える
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
于 2015-07-03T06:38:03.237 に答える
1

使用しているデータベースサーバーについては言及していませんが、一時テーブルが利用可能な場合は、それらが最善のアプローチである可能性があります。

// 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
于 2012-10-02T15:18:16.607 に答える
0
    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 
于 2016-10-05T08:04:48.353 に答える