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>
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>
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>
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!