MySQL : contrôler quelle ligne est renvoyée dans une requête Group BY
Dans MySQL, récupérer la ligne avec la valeur la plus élevée de chaque groupe est une tâche commune. Cependant, l'utilisation de la clause GROUP BY standard avec ORDER BY peut parfois conduire à des résultats inattendus.
Pour y parvenir, nous pouvons utiliser des approches alternatives qui remplacent le comportement de regroupement par défaut :
Sous-requête Méthode :
Cette méthode consiste à créer une sous-requête pour obtenir le version_id maximum pour chaque unique id :
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)
Cette requête rejoint la table d'origine avec une sous-requête qui sélectionne le version_id maximum pour chaque identifiant. La jointure garantit que seules les lignes avec le version_id le plus élevé sont renvoyées.
Sous-requête avec ORDER BY Trick :
Une variante de la méthode de sous-requête implique l'utilisation de ORDER BY dans le sous-requête pour garantir un ordre spécifique :
SELECT * FROM (SELECT * FROM table ORDER BY version_id DESC) t1 GROUP BY t1.id
Cette requête trie efficacement les lignes par ordre décroissant de version_id dans chaque groupe avant d'effectuer le regroupement, en veillant à ce que la ligne avec le version_id le plus élevé soit conservée pour chaque groupe.
Fonction Windows nommée :
Les fonctions de fenêtre permettent d'effectuer des calculs dans un ensemble de lignes définies par une fenêtre, qui peut être utilisée pour cette tâche :
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY version_id DESC) AS rn FROM table ) t WHERE rn = 1
Cette requête calcule le numéro de ligne pour chaque identifiant unique dans la partition définie par ROW_NUMBER. La clause WHERE filtre les lignes dont les numéros de ligne sont différents de 1, garantissant que seule la ligne avec le version_id le plus élevé pour chaque identifiant est renvoyée.
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!