Maison > base de données > tutoriel mysql > Comment puis-je récupérer efficacement l'enregistrement le plus élevé ou le plus bas par groupe dans une base de données ?

Comment puis-je récupérer efficacement l'enregistrement le plus élevé ou le plus bas par groupe dans une base de données ?

Barbara Streisand
Libérer: 2024-12-24 22:08:11
original
579 Les gens l'ont consulté

How Can I Efficiently Retrieve the Highest or Lowest Record per Group in a Database?

Récupération des enregistrements avec le plus haut/le plus bas par groupe

Énoncé du problème

Comment peut-on récupérer efficacement l'enregistrement avec le plus élevé ou la valeur la plus basse pour un champ spécifique au sein de chaque groupe défini par un autre champ ?

Solution utilisant Left Outer Rejoindre

Pour récupérer l'enregistrement avec la valeur la plus élevée pour le champ OrderField dans chaque GroupId, utilisez 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;
Copier après la connexion

Avantages de l'approche Join

  • Efficace pour les grands ensembles de données
  • Utilise un index sur (GroupId, OrderField) si disponible
  • Pas besoin de sous-requêtes ou de tri dans la requête

Alternatives

Si les données sont petites ou l'implémentation spécifique du moteur de base de données que vous utilisez est mal optimisée pour les jointures, vous pouvez envisager des alternatives telles que as :

  • Utilisation d'une sous-requête : Cela implique d'utiliser une sous-requête pour calculer la valeur maximale pour chaque groupe, puis de joindre cette sous-requête à la table principale pour récupérer les enregistrements correspondants.
  • Utilisation de la fonction de classement : Cela implique d'utiliser une fonction de fenêtre pour calculer le classement de chaque enregistrement au sein de chaque groupe, puis de filtrer en fonction sur le classement.

Inefficacité de la méthode utilisant la variable @Rank

La méthode que vous avez décrite en utilisant la variable @Rank, telle qu'écrite à l'origine, ne fonctionnera pas correctement car la variable @Rank ne se réinitialise pas à zéro après le traitement de la première table. Pour résoudre ce problème, vous devrez ajouter une autre table dérivée pour réinitialiser @Rank à zéro avant de traiter la deuxième table. Cependant, cette approche reste inefficace par rapport à l'approche join.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal