Bonjour,
Voilà mon problème...
J'ai une table 'test' comprenant les champs id,event,start,end.
J'ai simplifié le tout.
Chaque évènement a un statut qui n'est pas en base selon les start et end date:
Je vous file de quoi la créer.id | event | start | end 1 | event01 | 2017-01-01 | 2017-01-10 => Terminé 2 | event02 | 2017-01-02 | 2017-01-25 => En cours 3 | event03 | 2017-01-26 | 2017-01-30 => A venir 4 | event04 | 2017-01-04 | 2017-01-21 => En cours 5 | event05 | 2017-01-05 | 2017-01-06 => Terminé 6 | event06 | 2017-01-06 | 2017-01-22 => En cours 7 | event07 | 2017-01-21 | 2017-01-24 => A venir 8 | event08 | 2017-01-08 | 2017-01-09 => Terminé 9 | event09 | 2017-01-25 | 2017-01-27 => A venir 10 | event10 | 2017-01-10 | 2017-01-29 => En cours
Admettons que nous soyons le 20 Janvier 2017.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 CREATE TABLE `test` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `event` VARCHAR(50) NOT NULL DEFAULT '0', `start` DATE NOT NULL DEFAULT '0000-00-00', `end` DATE NOT NULL DEFAULT '0000-00-00', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1; INSERT INTO test (event,start,end) VALUES ('event01','2017-01-01','2017-01-10'), ('event02','2017-01-02','2017-01-25'), ('event03','2017-01-26','2017-01-30'), ('event04','2017-01-04','2017-01-21'), ('event05','2017-01-05','2017-01-06'), ('event06','2017-01-06','2017-01-22'), ('event07','2017-01-21','2017-01-24'), ('event08','2017-01-08','2017-01-09'), ('event09','2017-01-25','2017-01-27'), ('event10','2017-01-10','2017-01-29');
Je classe les évènements de cette manière
- En cours, puis A venir, puis Terminé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SET @date = '2017-01-20'; SELECT * FROM test ORDER BY CASE WHEN start < @date AND end > @date THEN 2 WHEN start > @date AND end > @date THEN 1 ELSE 0 END DESC;Jusque là tout va bien...2 | event02 | 2017-01-02 | 2017-01-25 => En cours 4 | event04 | 2017-01-04 | 2017-01-21 => En cours 6 | event06 | 2017-01-06 | 2017-01-22 => En cours 10 | event10 | 2017-01-10 | 2017-01-29 => En cours 3 | event03 | 2017-01-26 | 2017-01-30 => A venir 7 | event07 | 2017-01-21 | 2017-01-24 => A venir 9 | event09 | 2017-01-25 | 2017-01-27 => A venir 1 | event01 | 2017-01-01 | 2017-01-10 => Terminé 5 | event05 | 2017-01-05 | 2017-01-06 => Terminé 8 | event08 | 2017-01-08 | 2017-01-09 => Terminé
Mais j'aimerai affiner le tri pour chaque groupe de statuts
- Ceux qui sont "En cours", classés par date de fin ASCENDANTE (end ASC)
- Ceux qui sont "A venir", classés par date de début ASCENDANTE (start asc) - Ceux qui commencent prochainement d'abord
- Ceux qui sont "Terminé", classés par date de fin DESCENDANTE (end DESC) - Ceux qui viennent de terminer d'abord
On doit alors retourner un résultat comme celui-ci:
Je sais que c'est possible d'imbriquer TROIS SELECT correspondants au trois états classés comme je le souhaite mais peut-on le faire autrement ?4 | event04 | 2017-01-04 | 2017-01-21 => En cours 6 | event06 | 2017-01-06 | 2017-01-22 => En cours 2 | event02 | 2017-01-02 | 2017-01-25 => En cours 10 | event10 | 2017-01-10 | 2017-01-29 => En cours 7 | event07 | 2017-01-21 | 2017-01-24 => A venir 9 | event09 | 2017-01-25 | 2017-01-27 => A venir 3 | event03 | 2017-01-26 | 2017-01-30 => A venir 1 | event01 | 2017-01-01 | 2017-01-10 => Terminé 8 | event08 | 2017-01-08 | 2017-01-09 => Terminé 5 | event05 | 2017-01-05 | 2017-01-06 => Terminé
Un seul SELECT en gardant ou pas ORDER BY CASE.
J'espère que vous pourrez m'aider !
C'est je pense un bon exercice aussi pour ceux qui aiment ça ;-)
A+
coincoin22
Partager