Récupération d'emplacements historiques à l'aide de la date MAX dans une instruction de jointure
Lors de la récupération d'emplacements historiques pour un ID d'enregistrement spécifique, un utilisateur a rencontré des problèmes de performances et entrées en double dans les résultats. L'utilisateur a tenté de résoudre ce problème en joignant plusieurs tables et en filtrant par ID_reçu, mais le résultat attendu n'a pas été obtenu.
Pour résoudre ce problème, il est recommandé de modifier la requête comme suit :
SELECT t1.received_id , t1.transaction_id , t1.date_modified , l.location FROM transactions t1 JOIN ( SELECT received_id, MAX(date_modified) maxmodify FROM transactions GROUP BY received_id) max_record ON max_record.received_id = t1.received_id AND max_record.maxmodify = t1.date_modified JOIN locations l ON l.location_id = t1.location_id JOIN received r ON r.received_id = t1.received_id WHERE t1.received_id = '1782' ORDER BY t1.date_modified DESC
Le changement clé consiste à rejoindre la table des transactions deux fois : une fois pour la requête principale et une fois dans une sous-requête pour trouver la valeur date_modified maximale pour chaque reçu_id. Cette sous-requête est ensuite utilisée pour filtrer la requête principale et renvoyer uniquement les lignes avec les dernières valeurs date_modified.
Le cœur de cette technique est encapsulé dans le modèle général suivant :
SELECT x.* FROM my_table x JOIN (SELECT id,MAX(thing) max_thing FROM my_table GROUP BY id) y ON y.id = x.id AND y.max_thing = x.thing;
Ce Cette approche élimine efficacement les entrées en double et fournit le résultat souhaité : afficher uniquement la dernière heure modifiée pour chaque ID d'enregistrement et emplacement.
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!