집 >데이터 베이스 >MySQL 튜토리얼 >여러 테이블을 조인할 때 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!