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 |
SELECT * FROM messages GROUP BY Name
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:
: 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>
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>
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éthodeest 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!