Maison >base de données >tutoriel mysql >Comment récupérer efficacement les enregistrements avec les valeurs les plus élevées ou les plus basses par groupe en SQL ?
Obtenir les enregistrements avec les valeurs les plus élevées/les plus petites par groupe
Problème :
Récupérer les enregistrements avec les valeurs les plus élevées ou les plus petites pour un champ donné dans chaque group.
Ancienne solution proposée :
Utilisation des rangs (@rank := @rank 1) dans des requêtes complexes avec des sous-requêtes.
Solution alternative :
Une approche plus efficace consiste à utiliser une jointure externe gauche sans classement variables :
SELECT t1.* FROM `Table` AS t1 LEFT OUTER JOIN `Table` AS t2 ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField WHERE t2.GroupId IS NULL ORDER BY t1.OrderField;
Cette requête obtient le résultat souhaité en tirant parti d'une stratégie d'indexation sur (GroupId, OrderField) pour optimiser l'accès à t2.
Considérations d'optimisation :
AND (t1.OrderField < t2.OrderField OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))
Avantages de la jointure externe gauche Approche :
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!