ホームページ > データベース > mysql チュートリアル > 同じ MySQL テーブル内の異なる列から複数のカウントを効率的に集計するにはどうすればよいですか?

同じ MySQL テーブル内の異なる列から複数のカウントを効率的に集計するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-21 11:06:09
オリジナル
1029 人が閲覧しました

How to Efficiently Aggregate Multiple Counts from Different Columns in the Same MySQL Table?

MySQL: 単一テーブル内の複数の列にわたるカウントの効率的な集計

MySQL 内の同じテーブルで異なる列をターゲットとする複数のクエリは、非効率的なデータ取得や不正確な結果につながる可能性があります。 これを例で説明し、正しいアプローチを示しましょう。

t_hospital テーブル内のさまざまな基準に基づいてカウントを計算する必要があるとします。

非効率な方法 (複数のクエリ):

次のコードは、複数のクエリを使用してこれを達成しようとしますが、最初の列以降の列では誤った結果が生成されます。

SET @start_res = 20150301;
SET @finish_res= 20150501;
SET @finish_check= 20150801;
SET @start_check= 20150301;
SET @daily_hos= 3;

SELECT* from
   ( SELECT COUNT(DAY_IN) AS arr FROM t_hospital WHERE DAY_IN between  @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )e,
     (SELECT COUNT(PAT_STATUS) AS ONG1 FROM t_hospital WHERE PAT_STATUS  like '%ong%' and  DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN ) a,
        (SELECT COUNT(PAT_STATUS) AS RTED FROM t_hospital WHERE PAT_STATUS  like '%rtde%'and  DAY_IN between  @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )b,
           (SELECT COUNT(PAT_STATUS) AS POLI FROM t_hospital WHERE PAT_STATUS  like '%pol%'and DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN   )c,
              (SELECT COUNT(PAT_STATUS) AS para FROM t_hospital WHERE PAT_STATUS  like '%para%' and  DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )d;
ログイン後にコピー

効率的な方法 (条件付き集計を使用した単一クエリ):

最適なソリューションには、条件付き集計を使用する単一のクエリが含まれます。

SELECT DAY_IN, COUNT(*) AS arr,
        SUM(IF(PAT_STATUS  like '%ong%', 1, 0)) AS ONG1,
        SUM(IF(PAT_STATUS  like '%rtde%', 1, 0)) AS RTED,
        SUM(IF(PAT_STATUS  like '%pol%', 1, 0)) AS POL1,
        SUM(IF(PAT_STATUS  like '%para%', 1, 0)) AS para
FROM t_hospital 
WHERE DAY_IN between @start_check and @finish_check 
    and RES_DATE between @start_res and @finish_res  
    and ID_daily_hos =@daily_hos
GROUP BY DAY_IN;
ログイン後にコピー

このアプローチでは、IF() 関数を利用して、PAT_STATUS 値に基づいて条件付きで出現回数をカウントし、SUM() はこれらのカウントを DAY_IN ごとに集計します。この方法は大幅に効率が高く、正確な結果が得られます。 複数のサブクエリを結合することによって暗黙的に作成されるデカルト積を回避します。

以上が同じ MySQL テーブル内の異なる列から複数のカウントを効率的に集計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート