Joindre des tables avec un problème SUM dans MYSQL
Joindre des tables avec l'agrégation SUM peut introduire des complexités. Pour résoudre le problème des résultats incorrects dans votre requête, approfondissons le problème et explorons une solution.
La principale préoccupation de la requête donnée concerne les jointures multiples, ce qui entraîne un produit croisé. Cette multiplication des sommes par le nombre de lignes correspondantes dans d'autres tableaux conduit à des résultats erronés. Pour résoudre ce problème, nous pouvons déplacer les opérations SUM dans des sous-requêtes.
Voici une requête optimisée qui intègre des sous-requêtes pour les deux agrégations SUM :
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;
Cette requête utilise des sous-requêtes pour les minutes et le total. sommations, garantissant des résultats précis en évitant la multiplication de produits croisés. Il aligne également les délais pour les deux sous-requêtes afin de garantir une récupération cohérente des données. En refactorisant la requête avec des sous-requêtes, nous résolvons efficacement le problème causé par les jointures multiples et l'agrégation SUM.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!