Maison > base de données > tutoriel mysql > Comment puis-je récupérer efficacement le dernier enregistrement de chaque groupe de MySQL?

Comment puis-je récupérer efficacement le dernier enregistrement de chaque groupe de MySQL?

Barbara Streisand
Libérer: 2025-01-25 19:36:09
original
180 Les gens l'ont consulté

How Can I Efficiently Retrieve the Last Record in Each Group in MySQL?

MySQL: Extraction de l'enregistrement final de chaque groupe

Ce guide explore des méthodes efficaces pour récupérer le dernier enregistrement dans chaque groupe dans une base de données MySQL. Nous examinerons les techniques adaptées aux versions MySQL 8.0 et antérieures.

Fonctions MySQL 8.0 et fenêtre:

MySQL 8.0 Fonctions de fenêtre introduites, offrant une approche rationalisée. La requête suivante utilise ROW_NUMBER() pour attribuer un rang à chaque enregistrement de son groupe, ordonné par la colonne id (en supposant id représente un ordre chronologique):

<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

Cette requête partitionne les données de name (la colonne de groupement) et attribue le rang 1 au dernier enregistrement de chaque partition.

Techniques pré-Mysql 8.0:

Pour les versions MySQL avant 8.0, des stratégies alternatives sont nécessaires:

Méthode 1: Sous-requête avec groupe par:

Cette méthode exploite une sous-requête pour commander les données, puis regroupe les résultats:

<code class="language-sql">SELECT
  *
FROM (SELECT
  *
FROM messages
ORDER BY id DESC) AS x
GROUP BY name</code>
Copier après la connexion

Méthode 2: Rejoindre à gauche avec le filtrage nul:

Cette approche utilise un LEFT JOIN pour comparer chaque enregistrement avec les autres dans le même groupe. Les enregistrements sans enregistrement ultérieur (indiqué par un NULL dans le jointure) représentent le dernier enregistrement du groupe:

<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

Analyse des performances:

Les performances de ces méthodes varient en fonction de la taille des données et de la configuration de la base de données. Bien que les fonctions de fenêtre soient généralement efficaces, la méthode LEFT JOIN surpasse souvent la sous-requête GROUP BY, en particulier pour les grands ensembles de données. Des tests de référence sur des ensembles de données substantiels (par exemple, la base de données Stackoverflow August 2009) ont montré que l'approche LEFT JOIN est considérablement plus rapide.

Conclusion:

Les fonctions de fenêtre de MySQL 8.0 fournissent une solution élégante et souvent efficace. Pour les versions MySQL plus anciennes, la méthode LEFT JOIN offre une alternative robuste et souvent plus rapide, en particulier lorsqu'elle traite de grandes tables. La meilleure approche dépend de votre version MySQL spécifique et de votre taille de jeu de données.

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