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 サイトの他の関連記事を参照してください。