Join Tables with SUM Issue in MYSQL
Joining tables with SUM aggregation can introduce complexities. To address the issue of incorrect results in your query, let's delve into the problem and explore a solution.
The main concern in the given query is multiple joins, resulting in a cross product. This multiplication of sums by the number of matching rows in other tables leads to erroneous results. To rectify this issue, we can relocate the SUM operations into subqueries.
Here's an optimized query that incorporates subqueries for both SUM aggregations:
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 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;
This query utilizes subqueries for both minutes and total summations, ensuring accurate results by avoiding cross-product multiplication. It also aligns the timeframes for both subqueries to ensure consistent data retrieval. By refactoring the query with subqueries, we effectively resolve the issue caused by multiple joins and SUM aggregation.
The above is the detailed content of How to Correctly SUM Aggregate Values When Joining Multiple Tables in MySQL?. For more information, please follow other related articles on the PHP Chinese website!