Trier les enregistrements par date et heure avant de les regrouper dans MySQL
Lorsque vous traitez une table contenant des horodatages, il est essentiel de récupérer des informations basées sur des délais précis. Cependant, trier par date et heure avant de regrouper les enregistrements par un champ spécifique peut poser un défi dans MySQL.
Considérez le tableau suivant :
name date time tom | 2011-07-04 | 01:09:52 tom | 2011-07-04 | 01:09:52 mad | 2011-07-04 | 02:10:53 mad | 2009-06-03 | 00:01:01
Pour récupérer les enregistrements les plus anciens regroupés par nom, la requête suivante échouerait :
SELECT * ORDER BY date ASC, time ASC GROUP BY name
Cette requête ne fonctionne pas car GROUP BY doit apparaître avant ORDER BY. Cependant, le regroupement avant le tri entraîne le renvoi en premier de l'enregistrement « fou » le plus récent au lieu de l'ancien.
Pour surmonter ce problème, plusieurs approches sont disponibles :
Approche de sous-requête :
SELECT * FROM ( SELECT * FROM table_name ORDER BY date ASC, time ASC ) AS sub GROUP BY name
Cette méthode crée une sous-requête qui trie les enregistrements par date et heure, puis transmet les résultats à la requête externe pour les regrouper par nom. Puisque GROUP BY opère sur le premier enregistrement correspondant dans la sous-requête, il récupère l'enregistrement le plus ancien pour chaque nom.
ROW_NUMBER() Approche :
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date, time) AS row_num FROM table_name ) AS sub WHERE row_num = 1
ROW_NUMBER( ) attribue un numéro séquentiel à chaque ligne de chaque partition de nom, trié par date et heure. En sélectionnant uniquement les enregistrements avec row_num = 1, l'enregistrement le plus ancien pour chaque nom est choisi.
Approche de sous-requête MAX() :
SELECT * FROM table_name WHERE (date, time) IN ( SELECT MAX(date) AS date, MAX(time) AS time FROM table_name GROUP BY name )
Cette requête utilise un sous-requête pour sélectionner la date et l’heure maximales pour chaque nom. En filtrant la requête principale en fonction de ces valeurs, elle récupère l'enregistrement le plus ancien pour chaque nom.
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!