>데이터 베이스 >MySQL 튜토리얼 >MySQL에서 테이블을 조인할 때 곱해진 SUM 결과를 방지하려면 어떻게 해야 합니까?

MySQL에서 테이블을 조인할 때 곱해진 SUM 결과를 방지하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-19 14:32:091010검색

How Can I Avoid Multiplied SUM Results When Joining Tables in MySQL?

MySQL 조인에서 곱해진 SUM 결과 방지

MySQL 조인을 SUM 집계와 결합하면 데카르트 곱 효과로 인해 종종 부정확하고 부풀려진 결과가 생성됩니다. 여러 조인으로 인해 행이 중복되어 SUM 값이 부풀려질 수 있습니다. 해결책은 하위 쿼리를 사용하여 데이터를 사전 집계하는 것입니다.

효과적인 전략: 정확한 집계를 위한 하위 쿼리

SUM이 부풀려지는 것을 방지하려면 테이블을 조인하기 전에 집계를 수행하세요. 이는 데이터를 독립적으로 그룹화하고 합계한 다음 집계된 결과를 조인하는 하위 쿼리를 통해 달성됩니다.

쿼리 예 및 설명:

이 쿼리는 SUM 집계를 사용하는 동안 테이블을 올바르게 조인하는 방법을 보여줍니다.

<code class="language-sql">SELECT 
    i.last_name, 
    i.first_name, 
    DATE_FORMAT(LEAST(m.mil_date, t.tm_date), '%m/%d/%y') AS dates, 
    t.total, 
    m.minutes
FROM 
    bhds_teachers AS i
LEFT JOIN (
    SELECT 
        ds_id, 
        YEARWEEK(mil_date) AS week, 
        MIN(mil_date) AS mil_date, 
        SUM(drive_time) AS minutes
    FROM 
        bhds_mileage
    WHERE 
        mil_date BETWEEN '2016-04-11' AND '2016-04-30'
        AND ds_id = 5
    GROUP BY 
        ds_id, week
) AS m ON m.ds_id = i.ds_id
LEFT JOIN (
    SELECT 
        ds_id, 
        YEARWEEK(tm_date) AS week, 
        MIN(tm_date) AS tm_date, 
        SUM(tm_hours) AS total
    FROM 
        bhds_timecard
    WHERE 
        tm_date BETWEEN '2016-04-11' AND '2016-04-30'
        AND ds_id = 5
    GROUP BY 
        ds_id, week
) AS t ON t.ds_id = i.ds_id AND t.week = m.week;</code>

하위 쿼리(mt)는 drive_timetm_hours별로 그룹화하여 각각 ds_idweek의 합계를 독립적으로 계산합니다. 그런 다음 이러한 집계된 결과는 bhds_teachers 및 일치하는 i 숫자를 사용하여 ds_id(별칭 week)과 결합됩니다. LEAST()은 집계된 두 테이블에서 가장 빠른 날짜를 선택합니다. 이 방법은 합산 전에 결합 시 발생하는 곱셈 문제를 방지합니다.

위 내용은 MySQL에서 테이블을 조인할 때 곱해진 SUM 결과를 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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