>데이터 베이스 >MySQL 튜토리얼 >여러 테이블을 조인할 때 MySQL SUM() 결과가 잘못된 이유는 무엇입니까?

여러 테이블을 조인할 때 MySQL SUM() 결과가 잘못된 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-19 14:21:09657검색

Why Are My MySQL SUM() Results Incorrect When Joining Multiple Tables?

MySQL SUM() 및 다중 테이블 조인: 잘못된 집계 방지

SUM() MySQL에서 여러 테이블 조인과 계산을 결합하려면 부정확한 결과를 방지하기 위해 신중한 고려가 필요합니다. 조인 중 데카르트 곱 효과로 인해 합계가 부풀려지는 일반적인 함정이 발생합니다.

문제: SUM() 결과가 부풀려짐

사용자가 각각 서로 다른 테이블의 합계를 계산하는 두 개의 쿼리를 하나의 조인된 쿼리로 통합하려고 했습니다.

쿼리 1(마일리지): 교사별로 그룹화된 주당 운전 시간(분)의 합계입니다.

<code class="language-sql">SELECT last_name, first_name, ..., SUM(drive_time) AS MINUTES
FROM bhds_mileage ...
WHERE mil_date BETWEEN ... AND ...
GROUP BY ...</code>

쿼리 2(시간표): 교사별로 그룹화된 주당 총 시간의 합계입니다.

<code class="language-sql">SELECT last_name, first_name, ..., SUM(tm_hours) AS total
FROM bhds_timecard ...
WHERE tm_date BETWEEN ... AND ...
GROUP BY ...</code>

참여 시도 실패:

사용자가 이러한 쿼리를 직접 결합하려고 시도하여 잘못된 합계가 발생했습니다.

<code class="language-sql">SELECT last_name, first_name, ..., SUM(tm_hours) AS total, SUM(drive_time) AS MINUTES
FROM bhds_timecard ...
LEFT JOIN bhds_mileage ...
ON ...
WHERE ...
GROUP BY ...</code>

문제는? SUM() 함수는 조인 이후 적용되었으며, 조인된 테이블 간에 일치하는 행이 여러 개 있을 가능성으로 인해 합계가 곱해졌습니다.

해결책: 사전 집계된 하위 쿼리

올바른 접근 방식은 참여하기 전에 하위 쿼리의 합계를 미리 집계하는 것입니다.

<code class="language-sql">SELECT last_name, first_name, ..., total, minutes
FROM bhds_teachers ...
LEFT JOIN (
    -- Subquery 1: Mileage SUM
    SELECT teacher_id, SUM(drive_time) AS minutes, ...
    FROM bhds_mileage ...
    WHERE mil_date BETWEEN ... AND ...
    GROUP BY teacher_id
) AS m ON ...
LEFT JOIN (
    -- Subquery 2: Timecard SUM
    SELECT teacher_id, SUM(tm_hours) AS total, ...
    FROM bhds_timecard ...
    WHERE tm_date BETWEEN ... AND ...
    GROUP BY teacher_id
) AS t ON ...</code>

별도의 하위 쿼리 내에서 SUM() 작업을 수행함으로써 조인이 발생하기 전에 각 테이블의 데이터가 올바르게 집계되어 합계가 곱해지는 것을 방지하고 정확한 결과를 생성할 수 있습니다. teacher_id(또는 이와 동등한 것)은 올바른 조인 조건에 매우 중요합니다.

위 내용은 여러 테이블을 조인할 때 MySQL SUM() 결과가 잘못된 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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