Aller au contenu

ORDER BY CASE and date


billcom
Aller à la solution Solutionné par billcom,

Sujets conseillés

Bonjour le hub,



Je bloque sur une requête sql pour MYSQL.



J'ai une liste d'evenement avec un id "id_ev" et une date de début type DATE "date_deb_ev". Certains évènements sont déjà passé et d'autre sont à venir.


J'aimerai écrire une requête qui me permet d'afficher l'ensemble des évènements avec pour ordre d'affichage



Dans un premier temps les évènements à venir trié par date_deb_ev ASC et ensuite les évènement passé par date_deb_ev DESC le tout en une seule requête



Pour le moment j'ai ça



SELECT id_ev, date_deb_ev
FROM evenements
ORDER BY CASE WHEN
date_deb_ev >= CURDATE() THEN 0 ELSE 1 end ASC,
id_ev ASC




+-------+-------------+
| id_ev | date_deb_ev |
+-------+-------------+
| 59 | 2014-04-30 |
| 106 | 2014-05-23 |
| 110 | 2014-04-26 |
| 146 | 2014-05-21 |
| 147 | 2014-04-30 |
| 156 | 2014-04-26 |
| 172 | 2014-04-30 |
| 175 | 2014-05-23 |
| 202 | 2014-05-21 |
| 224 | 2014-05-27 |
| 226 | 2014-05-27 |
| 227 | 2014-05-28 |
| 242 | 2014-05-21 |
| 243 | 2014-04-28 |
| 254 | 2014-04-26 |
| 266 | 2014-04-30 |
| 267 | 2014-04-30 |
| 268 | 2014-05-24 |
| 270 | 2014-06-18 |
| 278 | 2014-04-30 |
+-------+-------------+
20 rows in set (0.04 sec)


ça me retourne un resultat mais rien de cohérent avez vous une idée ou une piste pour mener à bien ma requête ?


Lien vers le commentaire
Partager sur d’autres sites

Bonjour ,



Tu ordonnes tes dates en te basant sur ton champ id_ev ,


Base toi sur tes dates , essaye le code suivant :



SELECT id_ev, date_deb_ev
FROM test.evenements
ORDER BY CASE WHEN
date_deb_ev >= CURDATE() THEN 0 ELSE 1 end ASC,
date_deb_ev ASC

Modifié par BouleBilll
Lien vers le commentaire
Partager sur d’autres sites

Salut BouleBill,



Merci la solution est bonne smile.gif



Et pour faire un tri des évènements à venir en date_dev_ev ASC et les évènements passé date_deb_ev DESC tu aurai une idée ?


Lien vers le commentaire
Partager sur d’autres sites

  • Solution

Version définitive de la requête :)





SELECT id_ev, date_deb_ev
FROM evenements
ORDER BY CASE WHEN
date_deb_ev >= CURDATE() THEN 0 ELSE 1 end ASC,
ABS(DATEDIFF(date_deb_ev, CURDATE())) ASC

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...