Détermination du dernier enregistrement au sein d'un groupe via GROUP BY
Dans un scénario de base de données impliquant plusieurs enregistrements avec des critères de regroupement similaires, une tâche courante consiste à récupérer le dernier enregistrement pour chaque groupe. Ceci est illustré dans les plateformes de messagerie, où le message le plus récent de chaque utilisateur est souhaité.
Tentative initiale et inconvénient
Une approche initiale consiste à utiliser la clause GROUP BY pour regrouper les enregistrements en groupes distincts, comme le montre la requête :
SELECT * FROM messages GROUP BY from_id
Cependant, cette requête récupère le message le plus ancien au sein de chaque groupe plutôt que le plus récent un.
Résolution des requêtes
Pour obtenir le dernier enregistrement pour chaque groupe, une approche plus sophistiquée est nécessaire. Cela implique :
Sous-requête : déterminez la dernière valeur d'horodatage au sein de chaque groupe à l'aide de la sous-requête suivante :
SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id
Rejoindre la sous-requête : rejoignez la table des messages d'origine avec la sous-requête, correspondant aux colonnes from_id et timestamp où ils correspondre.
SELECT t1.* FROM messages t1 JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id) t2 ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp;
Cette requête génère le dernier message pour chaque from_id distinct dans la table des messages, répondant au problème initial.
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!