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