> 데이터 베이스 > MySQL 튜토리얼 > 제품 간 문제를 방지하기 위해 MySQL에서 조인된 테이블의 집계 값을 올바르게 합산하는 방법은 무엇입니까?

제품 간 문제를 방지하기 위해 MySQL에서 조인된 테이블의 집계 값을 올바르게 합산하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-19 14:16:10
원래의
763명이 탐색했습니다.

How to Correctly Sum Aggregate Values from Joined Tables in MySQL to Avoid Cross Product Issues?

SUM 집계를 사용하여 MySQL에서 테이블 조인: 제품 간 문제 해결

SUM 집계 함수를 사용하여 두 쿼리를 결합하면 MySQL에서 문제가 발생하는 경우가 많습니다. 테이블 간의 교차곱으로 인해 잘못된 SUM 값이 발생할 수 있습니다. 이 문제를 해결하려면 SUM 함수를 하위 쿼리로 캡슐화해야 합니다.

두 쿼리가 특정 날짜와 교사 ID 5에 대해 각각 SUM(drive_time) 및 SUM(tm_hours)을 검색하는 다음 예를 고려해 보세요.

쿼리 1:

<code class="language-sql">SELECT last_name, first_name, DATE_FORMAT(mil_date, '%m/%d/%y') AS dates, 
SUM(drive_time) MINUTES 
FROM bhds_mileage 
LEFT JOIN bhds_teachers i 
ON i.ds_id = bhds_mileage.ds_id 
WHERE mil_date BETWEEN '2016-04-11' AND '2016-04-30' 
AND bhds_mileage.ds_id = 5 
GROUP BY CONCAT(YEAR(mil_date), '/', WEEK(mil_date)), bhds_mileage.ds_id 
ORDER BY last_name ASC, dates ASC</code>
로그인 후 복사

쿼리 2:

<code class="language-sql">SELECT last_name, first_name, DATE_FORMAT(tm_date, '%m/%d/%y') AS dates,   
SUM(tm_hours) total 
FROM bhds_timecard 
LEFT JOIN bhds_teachers i 
ON i.ds_id = bhds_timecard.ds_id 
WHERE tm_date BETWEEN '2016-04-11' AND '2016-04-30' AND bhds_timecard.ds_id = 5 
GROUP BY CONCAT(YEAR(tm_date), '/', WEEK(tm_date)), bhds_timecard.ds_id 
ORDER BY last_name ASC, dates ASC</code>
로그인 후 복사

간단한 연결 시도:

이러한 쿼리를 결합하는 간단한 방법은 다음과 같이 연결하는 것입니다.

<code class="language-sql">SELECT last_name, first_name, DATE_FORMAT(tm_date, '%m/%d/%y') AS dates,  
SUM(tm_hours) total, SUM(drive_time) MINUTES 
FROM bhds_timecard 
LEFT JOIN bhds_teachers i 
ON i.ds_id = bhds_timecard.ds_id 
LEFT JOIN bhds_mileage 
ON DATE_FORMAT(bhds_timecard.tm_date, '%m/%d/%y') = DATE_FORMAT(bhds_mileage.mil_date, '%m/%d/%y') AND bhds_timecard.ds_id = bhds_mileage.ds_id 
WHERE tm_date BETWEEN '2016-04-11' AND '2016-04-30' AND bhds_timecard.ds_id = 5 
GROUP BY CONCAT(YEAR(tm_date), '/', WEEK(tm_date)), bhds_timecard.ds_id </code>
로그인 후 복사

그러나 이 접근 방식은 테이블 간에 교차곱을 생성하여 잘못된 SUM 값을 초래합니다.

해결책:

올바른 SUM 값을 얻으려면 SUM 집계 함수를 하위 쿼리로 이동하세요. 이렇게 하면 외적 문제가 방지되고 SUM 값이 관련 행에서만 계산됩니다.

<code class="language-sql">SELECT last_name, first_name, DATE_FORMAT(LEAST(mil_date, tm_date), '%m/%d/%y') AS dates, 
        total, 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 bhds_mileage.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 bhds_timecard.ds_id = 5 
    GROUP BY ds_id, week 
) AS t 
ON t.ds_id = i.ds_id AND t.week = m.week </code>
로그인 후 복사

위 내용은 제품 간 문제를 방지하기 위해 MySQL에서 조인된 테이블의 집계 값을 올바르게 합산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿