Dans les bases de données relationnelles, vous devez parfois récupérer la ligne avec la valeur maximale d'une colonne spécifique pour chaque groupe. C'est ce qu'on appelle la sélection du maximum par groupe. Dans MySQL, il existe plusieurs approches pour y parvenir.
Une méthode efficace consiste à utiliser une sous-requête :
SELECT * FROM ( SELECT id, MAX(version_id) AS version_id FROM table GROUP BY id ) AS t1 INNER JOIN table AS t2 ON t2.id = t1.id AND t1.version_id = t2.version_id;
Cette sous-requête crée une table des ID de version maximum pour chaque ID, puis le joint à la table d'origine pour récupérer les lignes correspondantes. Il est relativement efficace et suppose l'existence d'un index sur les colonnes (id, version_id).
Alternativement, vous pouvez utiliser des fonctions d'agrégation et de classement :
SELECT id, version_id, field1, field2 FROM ( SELECT id, version_id, field1, field2, RANK() OVER (PARTITION BY id ORDER BY version_id DESC) AS ranking FROM table ) AS ranked_table WHERE ranking = 1;
Cette requête classe les lignes de chaque ID par ordre décroissant de version_id et sélectionne celles avec un classement de 1, effectivement filtrage pour la version maximale.
Les fonctions de fenêtre peuvent également être utilisées à cette fin :
SELECT id, version_id, field1, field2 FROM ( SELECT id, version_id, field1, field2, MAX(version_id) OVER (PARTITION BY id) AS max_version_id FROM table ) AS windowed_table WHERE version_id = max_version_id;
Cette requête calcule l'ID de version maximum pour chaque ID en utilisant la fonction de fenêtre MAX() over() et sélectionne les lignes avec les ID de version correspondants.
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!