65 votes

ORDER BY date et heure AVANT GROUP BY nom dans mysql

j'ai un tableau comme celui-ci :

 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

je veux le nom le plus ancien en premier :

 SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name

(-> ne fonctionne pas !)

maintenant ça devrait me donner d'abord fou (a une date antérieure) puis tom

mais avec GROUP BY name ORDER BY date ASC, time ASC me donne d'abord le nouveau fou parce qu'il se regroupe avant de trier !

encore une fois : le problème est que je ne peux pas trier par date et heure avant de grouper car GROUP BY doit être avant ORDER BY !

90voto

user1908688 Points 191

Autre méthode :

 SELECT * 
FROM (
    SELECT * FROM table_name
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name

GROUP BY regroupe sur le premier résultat correspondant qu'il atteint. Si ce premier hit correspondant est celui que vous voulez, tout devrait fonctionner comme prévu.

Je préfère cette méthode car la sous-requête a un sens logique plutôt que de la parsemer d'autres conditions.

50voto

Vincent Points 640

Comme je ne suis pas autorisé à commenter la réponse de l'utilisateur 1908688, voici un indice pour les utilisateurs de MariaDB :

 SELECT *
FROM (
     SELECT *
     ORDER BY date ASC, time ASC
     LIMIT 18446744073709551615
     ) AS sub
GROUP BY sub.name

https://mariadb.com/kb/en/mariadb/why-is-order-by-in-a-from-subquery-ignored/

29voto

Cyril Gandon Points 8930

Je pense que c'est ce que tu cherches :

 SELECT name, min(date)
FROM myTable
GROUP BY name
ORDER BY min(date)

Pour l'heure, il faut faire une date mysql via STR_TO_DATE :

 STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s')

Donc :

 SELECT name, min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))
FROM myTable
GROUP BY name
ORDER BY min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))

13voto

jokermt235 Points 184

Cela a fonctionné pour moi:

 SELECT *
FROM your_table
WHERE id IN (
    SELECT MAX(id)
    FROM your_table
    GROUP BY name
);

4voto

Bohemian Points 134107

Utilisez une sous-sélection :

 select name, date, time
from mytable main
where date + time = (select min(date + time) from mytable where name = main.mytable)
order by date + time;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X