>데이터 베이스 >MySQL 튜토리얼 >동일한 MySQL 테이블에 있는 여러 열의 여러 개수를 효율적으로 집계하는 방법은 무엇입니까?

동일한 MySQL 테이블에 있는 여러 열의 여러 개수를 효율적으로 집계하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-21 11:06:091008검색

How to Efficiently Aggregate Multiple Counts from Different Columns in the Same MySQL Table?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.