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
を数える) のみが正しい結果を生成します。 ONG1
、RTED
、POLI
、および para
(異なる PAT_STATUS
値の出現回数のカウント) は、個別のクエリの結合が不適切であるため不正確です。
解決策: 単一のクエリ内で MySQL の集計関数 (SUM
と IF
) を使用すると、より効率的で正確なソリューションが提供されます。
<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 サイトの他の関連記事を参照してください。