Ce didacticiel aborde la question de savoir comment récupérer les enregistrements avec les valeurs les plus élevées ou les plus petites pour un champ spécifié au sein de chaque groupe, sans compter sur le classement (@Rank). Alors que cette question initiale utilisait @Rank comme solution, les réponses suivantes démontrent une approche plus efficace utilisant les jointures.
Pour obtenir la ligne avec le OrderField le plus élevé pour chaque groupe, utilisez un élément extérieur gauche join et la requête suivante :
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;
Si plusieurs enregistrements ont le même OrderField au sein d'un groupe et que vous en avez besoin, vous pouvez étendre la condition comme suit :
SELECT t1.* FROM `Table` AS t1 LEFT OUTER JOIN `Table` AS t2 ON t1.GroupId = t2.GroupId AND (t1.OrderField < t2.OrderField OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id)) WHERE t2.GroupId IS NULL
Cette requête affinée garantit que t1 est renvoyé uniquement lorsqu'aucune autre ligne t2 n'existe dans le même groupe GroupId ayant soit une valeur OrderField supérieure, soit un OrderField égal avec une valeur Id inférieure. Ainsi, il récupère efficacement la ligne avec le plus grand OrderField au sein de chaque groupe.
L'utilisation de l'approche de jointure externe gauche peut améliorer considérablement les performances des requêtes par rapport à la méthode précédente impliquant @Rank et des sous-requêtes. La jointure externe gauche peut exploiter un index sur (GroupId, OrderField) pour un accès optimisé.
L'approche initiale utilisant @Rank peut ne pas fonctionner comme prévu en raison du fait que Les incréments de @Rank se poursuivent après le traitement de la première table. Pour remettre @Rank à zéro entre les tables, vous devrez introduire une table dérivée supplémentaire, mais cela peut entraîner une mauvaise optimisation.
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!