[SQL] ORDER BY selon préférence

ORDER BY selon préférence [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 23-02-2014 à 14:06:42    

Bonjour,
 
Je voudrais afficher tout un catalogue de livres dont certains produits en vente flash dans l'ordre suivant :
 
-------- heure croissante jusqu'a minuit-------------------------------------------------
1) Babar (vente flash ! expire aujourd'hui a 17h)  
2) Le roi lion (vente flash ! expire aujourd'hui a 18h)
3) La petite sirène (vente flash ! expire aujourd'hui a 23h)
-------- heure décroissante le dernier a avoir eu une vente flash est en priorité -----------
4) Aladin (pas une vente flash mais ca l'a été hier a 16h)
5) La belle et la bête (pas une vente flash mais ca l'a été hier a 15h)
-------- les autres livres s'affichent aussi selon leur ID décroissant ------------------------
6) Les aristochats (jamais été une vente flash)
7) Boule et Bill (jamais été une vente flash)
etc...
 
J'ai une table "livre" avec un champ "expiration" en DATETIME.
Par exemple si je veux que Babar soit en vente flash je mets a jour le datetime dans expiration. Et étant donné mon ORDER BY cela s'affichera tout de suite en tête des résultats.
 
Quelqu'un aurait une idée pour construire cette requête SQL ?  
 
Merci  :hello:


Message édité par tomware le 23-02-2014 à 14:14:07
Reply

Marsh Posté le 23-02-2014 à 14:06:42   

Reply

Marsh Posté le 24-02-2014 à 13:40:59    

Code :
  1. Select *
  2. From livre
  3. Order By CASE WHEN Expiration >= GETDATE() THEN Expiration ELSE 99999 END Asc
  4.    , CASE WHEN Expiration < GETDATE() THEN Expiration ELSE 0 END Desc
  5.    , ID


 
Éventuellement changer le 0 et 99999 en autre chose si ça pose problème dans les cas limite.
 
Testé avec ca comme données:

Code :
  1. INSERT livre (Titre, Expiration) VALUES ('Les Aristochats', NULL)
  2. INSERT livre (Titre, Expiration) VALUES ('Babar', '2014-02-24 17:00')
  3. INSERT livre (Titre, Expiration) VALUES ('Boule et Bill', NULL)
  4. INSERT livre (Titre, Expiration) VALUES ('Le Roi Lion', '2014-02-24 18:00')
  5. INSERT livre (Titre, Expiration) VALUES ('La petite Sirène', '2014-02-24 23:00')
  6. INSERT livre (Titre, Expiration) VALUES ('La belle et la bete', '2014-02-23 15:00')
  7. INSERT livre (Titre, Expiration) VALUES ('Aladin', '2014-02-23 16:00')


 
Et ca donne:

Code :
  1. Babar
  2. Le Roi Lion
  3. La petite Sirène
  4. Aladin
  5. La belle et la bete
  6. Les Aristochats
  7. Boule et Bill

Reply

Marsh Posté le 24-02-2014 à 17:42:40    

Oliiii
 
 [:pedrolito37skyblog]  [:xplosif]  [:hello]  [:el awrence]  
 
 [:swedish chef]  
 
Ca marche PAR-FAITE-MENT grace a toi !
 
MERCI

Reply

Marsh Posté le 24-02-2014 à 17:44:07    

Au fait a quoi correspond  ELSE 99999 et ELSE 0 ?

Reply

Marsh Posté le 25-02-2014 à 07:56:06    

C'est pour "ignorer" les lignes qui ne doivent pas être triée par cette étape du order by.
 
99999 pour mettre ce qui n'est pas en flash sale en dessous des flash sale (en supposant que 99999 sera la plus grande date dans la table).
0 Pour mettre les flash sale au dessus (en supposant que 0 est plus petit que la plus petite date dans la table).
 
Tout le truc n'est nécessaire que parce que tu veux trier les flash sale en ordre descendant et les vielles flash sale en ordre ascendant (ce qui est logique d'un point de vue marketing).
Sans ça tu aurais pu t'en sortir plus facilement avec juste un Order By Expiration Desc, ID.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed