집 >데이터 베이스 >MySQL 튜토리얼 >동일한 MySQL 테이블에 있는 여러 열의 여러 개수를 효율적으로 집계하는 방법은 무엇입니까?
MySQL: 단일 테이블 내 여러 열의 카운트를 효율적으로 집계
MySQL에서 동일한 테이블이지만 다른 열을 대상으로 하는 여러 쿼리는 데이터 검색의 비효율성과 부정확한 결과를 초래할 수 있습니다. 예를 들어 이를 설명하고 올바른 접근 방식을 보여드리겠습니다.
t_hospital
테이블 내의 다양한 기준에 따라 개수를 계산해야 한다고 가정해 보겠습니다.
비효율적인 방법(다중 쿼리):
다음 코드는 여러 쿼리를 사용하여 이를 달성하려고 시도하지만 첫 번째 쿼리 이후의 열에 대해서는 잘못된 결과를 생성합니다.
<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>
효율적인 방법(조건부 집계를 사용한 단일 쿼리):
최적의 솔루션에는 조건부 집계를 사용하는 단일 쿼리가 포함됩니다.
<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()
는 각 DAY_IN
에 대해 이러한 횟수를 집계합니다. 이 방법은 훨씬 더 효율적이며 정확한 결과를 제공합니다. 여러 하위 쿼리를 결합하여 암시적으로 생성된 데카르트 곱을 방지합니다.
위 내용은 동일한 MySQL 테이블에 있는 여러 열의 여러 개수를 효율적으로 집계하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!