Maison > base de données > tutoriel mysql > Comment renvoyer efficacement la dernière ligne de chaque groupe dans MySQL ?

Comment renvoyer efficacement la dernière ligne de chaque groupe dans MySQL ?

DDD
Libérer: 2024-11-11 20:29:02
original
700 Les gens l'ont consulté

How to Efficiently Return the Last Row of Each Group in MySQL?

Renvoyer efficacement la dernière ligne de chaque groupe dans MySQL

Renvoyer la dernière ligne de chaque groupe dans MySQL est souvent nécessaire pour la manipulation des données. La requête fournie dans l'invite :

select * 
    from foo as a
    where a.id = (select max(id) from foo where uid = a.uid group by uid)
    group by uid;
Copier après la connexion

y parvient en effectuant une requête imbriquée pour trouver l'ID maximum pour chaque UID unique, puis en sélectionnant uniquement les lignes avec l'ID correspondant.

Une approche plus efficace

Cependant, une requête plus efficace peut être utilisée pour éliminer les éléments imbriqués requête :

SELECT t1.* 
FROM foo t1
JOIN (
    SELECT uid, MAX(id) AS max_id 
    FROM foo 
    GROUP BY uid
) t2 ON t1.id = t2.max_id;
Copier après la connexion

Cette requête utilise une opération JOIN pour faire correspondre directement l'ID maximum de chaque UID, offrant ainsi des performances améliorées par rapport à l'approche de requête imbriquée.

Considérations supplémentaires en matière d'optimisation

Pour une optimisation plus poussée, EXPLAIN peut être utilisé pour analyser le plan de requête et identifier les goulots d'étranglement potentiels. De plus, un index sur la colonne UID peut améliorer considérablement les performances des requêtes.

Approche alternative

Une autre option consiste à utiliser la fonction LAG() :

SELECT t1.* 
FROM foo t1
LEFT JOIN foo t2
ON t1.id < t2.id AND t1.uid = t2.uid
WHERE t2.id is NULL;
Copier après la connexion

Cette requête utilise la fonction LAG() pour identifier la ligne suivante du groupe. S'il n'y a pas de ligne suivante (c'est-à-dire que la ligne actuelle est la dernière de son groupe), la requête renverra la ligne actuelle. Bien que cette approche puisse être efficace, elle n'est pas toujours aussi performante que les requêtes basées sur JOIN évoquées ci-dessus.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal