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

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

Barbara Streisand
リリース: 2025-01-21 10:56:10
オリジナル
632 人が閲覧しました

How to Efficiently Aggregate Data from Multiple Columns Across Different Tables in MySQL?

MySQL の複数の列からのデータを効率的に要約する

リレーショナル データベースを操作する場合、多くの場合、異なるテーブルの複数の列にまたがるデータを集計する必要があります。 複数のクエリを単純に連結すると、不正確な結果が生じる可能性があります。 この例では、一般的な問題と、MySQL を使用したその効率的な解決策を示します。

t_hospital テーブルからの患者データを要約するために設計されたこの最初の MySQL クエリについて考えてみましょう。

<code class="language-sql">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;</code>
ログイン後にコピー

問題: arr (DAY_IN を数える) のみが正しい結果を生成します。 ONG1RTEDPOLI、および para (異なる PAT_STATUS 値の出現回数のカウント) は、個別のクエリの結合が不適切であるため不正確です。

解決策: 単一のクエリ内で MySQL の集計関数 (SUMIF) を使用すると、より効率的で正確なソリューションが提供されます。

<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>
ログイン後にコピー

この改訂されたクエリは、各 DAY_IN のデータを正しく集計し、単一の効率的なクエリ内で各 PAT_STATUS カテゴリの正確な数を提供します。 このアプローチにより、デカルト積と、その結果生じる元のクエリの不正確さが回避されます。

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

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