Maison > base de données > tutoriel mysql > Comment trouver efficacement le dernier enregistrement de chaque groupe dans MySQL ?

Comment trouver efficacement le dernier enregistrement de chaque groupe dans MySQL ?

Patricia Arquette
Libérer: 2025-01-25 19:32:11
original
340 Les gens l'ont consulté

How to Efficiently Find the Last Record in Each Group in MySQL?

MySQL efficace pour obtenir le dernier enregistrement de chaque groupe

Dans SQL, l'extraction des derniers enregistrements de chaque groupe peut être plus délicat. La scène commune est: il y a plusieurs enregistrements dans le tableau pour partager la même clé principale, et vous devez extraire les derniers éléments de chaque clé primaire. Cet article fournit une solution efficace et optimisée.

Description du problème

Considérons le tableau suivant:

La requête de groupe de base en utilisant produira les résultats suivants: messages

Id Name Other_Columns
1 A A_data_1
2 A A_data_2
3 A A_data_3
4 B B_data_1
5 B B_data_2
6 C C_data_1
Cependant, la sortie attendue est le dernier enregistrement de chaque groupe:

SELECT * FROM messages GROUP BY Name

Solution
Id Name Other_Columns
1 A A_data_1
4 B B_data_1
6 C C_data_1

Utilisez la fonction de fenêtre (MySQL 8.0 et versions supérieures)
Id Name Other_Columns
3 A A_data_3
5 B B_data_2
6 C C_data_1

MySQL 8.0 a introduit la fonction de fenêtre pour fournir une solution élégante pour trouver le dernier enregistrement de chaque groupe. La requête suivante utilise la fonction pour atteindre cet objectif:

lept join (première version de MySQL)

Avant MySQL 8.0, la solution la plus efficace consiste à utiliser

: ROW_NUMBER()

<code class="language-sql">WITH ranked_messages AS (
  SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn
  FROM messages AS m
)
SELECT * FROM ranked_messages WHERE rn = 1;</code>
Copier après la connexion
Performances et applicabilité

Bien que les deux solutions soient très efficaces, leurs performances peuvent varier de la taille et de la distribution des données. Pour les ensembles de données grands et divers, la méthode de la fonction de fenêtre est généralement recommandée.

Si les données présentent un mode spécifique (comme les relativement peu d'enregistrements de chaque groupe), la méthode LEFT JOIN peut être plus efficace.

<code class="language-sql">SELECT m1.*
FROM messages m1 LEFT JOIN messages m2
ON (m1.name = m2.name AND m1.id < m2.id)
WHERE m2.id IS NULL;</code>
Copier après la connexion
Test de référence

Dans de nombreux cas, les méthodes

se sont révélées meilleures que la technologie de regroupement. Par exemple, dans une grande base de données avec des millions de lignes, le temps d'exécution de la méthode

est inférieure à une seconde et la technologie de regroupement prend plus d'une minute.

Cependant, il est toujours recommandé de tester ces deux solutions sur votre ensemble de données spécifiques pour déterminer la meilleure méthode. LEFT 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!

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