Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL - Contrôlez quelle ligne est renvoyée par un groupe en

Cela s'appelle sélectionner le maximum d'une colonne par groupe. Voici plusieurs approches différentes pour mysql.

Voici comment je procéderais :

SELECT *
FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1
INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id

Ce sera relativement efficace, bien que mysql crée une table temporaire en mémoire pour la sous-requête. Je suppose que vous avez déjà un index sur (id, version_id) pour cette table.

C'est une lacune en SQL que vous devez plus ou moins utiliser une sous-requête pour ce type de problème ( semi-jointure sont un autre exemple).

Les sous-requêtes ne sont pas bien optimisées dans mysql, mais les sous-requêtes non corrélées ne sont pas si mauvaises tant qu'elles ne sont pas si énormes qu'elles seront écrites sur le disque plutôt que sur la mémoire. Étant donné que cette requête n'a que deux entiers, la sous-requête pouvait contenir des millions de lignes bien avant que cela ne se produise, mais la sous-requête select * de votre première requête pourrait souffrir de ce problème beaucoup plus tôt.