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

MySQL の複数のテーブルにわたる複数の列からデータを効率的に集計するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-21 11:01:09656ブラウズ

How Can I Efficiently Aggregate Data from Multiple Columns Across Multiple Tables in MySQL?

MySQL の複数テーブルおよび複数列データの効率的な集計方法

結果セットを強化するプロセスでは、多くの場合、各テーブルに対象となる特定の列が含まれる複数のテーブルからのデータを統合する必要があります。ただし、これを実現するために複数の SELECT ステートメントを使用するのは面倒で非効率的になる可能性があります。

次の例に示すように、2 つのテーブルから集計列を取得する必要があるとします。

<code class="language-sql">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</code>

このアプローチでは、最初の列だけが正しく表示され、他の列の結果が間違っているという問題がよく発生します。

解決策は、単一の SELECT ステートメントと条件付き集計を使用することです。

<code class="language-sql">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</code>

この変更されたステートメントでは、条件付き集計は IF() 関数を使用して各行の特定の PAT_STATUS パターンを評価し、一致するパターンの数を増やします。次に、SUM() 関数はこれらのカウントを集計して、目的の結果セットを生成します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。