[Résolu] aide requête SQL: tri par date desc avec date "nulle" en 1er

aide requête SQL: tri par date desc avec date "nulle" en 1er [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 03-06-2009 à 18:44:17    

Bonjour tous,  
 
je suis un peu à la ramasse pour exécuter une requête SQL qui me donne le résultat que je cherche à obtenir.
 
Je simplifie ma table au maximum pour illustrer mon problème :  
Table myitems
Champs=id;mydate
1;2004-01-01 00:00:00
2;2004-02-02 00:00:00
3;0000-00-00 00:00:00

 
C'est une table MySQL qui contient un champ ID numérique et un champ "mydate" au format DATE mysql.
 
Je voudrais une requête qui me trie la table en mode DESC, mais qui afficherait les dates "nulles" (je dis "nulles" mais en fait la valeur défaut est "0000-00-00" ) en premier, c'est-à-dire comme étant considérées comme les plus récentes.
Pour reprendre l'exemple de la table ici, la requête devrait donner dans l'ordre : 3,2,1
 
La requête :  

Code :
  1. SELECT id,mydate FROM myitems ordre BY mydate DESC


me donne évidemment 2,1,3
 
Alors j'ai essayé de passer la date par défaut à 2038-01-19 (genre le maximum d'un timestamp 32 bits si je ne m'abuse) mais ça fout un bronx pas possible dans mon code, où je fais plusieurs tests voir si la date existe ou pas et je l'affiche en conséquence ou j'affiche un message différent s'il n'y en a pas;
J'ai essayé de rendre le champs mydate nullable (default value NULL) , NULL se comporte aussi comme une date plus ancienne.
 
Je suppose que je peux faire des trucs plus complexes du genre mettre tous mes résultats dans une array (style en PHP) et puis prendre ceux que je veux dans l'ordre qui me plaît, mais y aurait-il un moyen d'obtenir l'ordre que je désire (pas de date -> date plus récente -> date plus ancienne), directement depuis une commande SQL ?


Message édité par ZeBix le 17-06-2009 à 11:43:57
Reply

Marsh Posté le 03-06-2009 à 18:44:17   

Reply

Marsh Posté le 04-06-2009 à 11:34:15    

Tu peux essayer un truc genre :

 

SELECT id,mydate, IF(mydate,mydate,4294967295) as myseconddate FROM myitems ORDER BY myseconddate DESC

Message cité 1 fois
Message édité par guybrush02 le 04-06-2009 à 11:34:43
Reply

Marsh Posté le 04-06-2009 à 12:18:28    

ca n'existe pas en mysql?

 
Code :
  1. SELECT id,mydate FROM myitems ordre BY mydate DESC nulls first

Message cité 2 fois
Message édité par casimimir le 04-06-2009 à 12:18:40
Reply

Marsh Posté le 04-06-2009 à 12:18:56    

casimimir a écrit :

ca n'existe pas en mysql (je suis full oracle)?
 

Code :
  1. SELECT id,mydate FROM myitems ordre BY mydate DESC nulls first



Reply

Marsh Posté le 04-06-2009 à 12:42:26    

Je ne pense pas qu'y a ça en mysql. Y a ptete moyen de faire un ORDER BY mydate=0, mydate DESC. Aucune idée... :s
 
Par contre, si son champ date est indexé, ça peut valoir la peine de ne pas perdre l'index (comme dans ma solution).  
Je pense à un truc du genre :
SELECT id, mydate, CASE mydate WHEN 0 THEN 1 ELSE 0 as sortkey FROM myitems ORDER BY sortkey DESC, mydate DESC
 
Mais je ne suis pas sûr que ça profite de l'index (et c'est pas "très beau" ^^)
 
 

Reply

Marsh Posté le 17-06-2009 à 11:43:19    

Sorry pour la réaction tardive, j'avais un peu laissé passer le sujet !
 

casimimir a écrit :

ca n'existe pas en mysql?
 

Code :
  1. SELECT id,mydate FROM myitems ordre BY mydate DESC nulls first



Je viens d'essayer, ça n'existe pas en MySQL. Et c'est bien dommage car c'est exactement ce que je voudrais !  
 

guybrush02 a écrit :

Tu peux essayer un truc genre :  
 
SELECT id,mydate, IF(mydate,mydate,4294967295) as myseconddate FROM myitems ORDER BY myseconddate DESC


 
ça marche NICKEL ! merci beaucoup c'est exactement ça. Et je peux toujours utiliser mydate qui reste donc bien NULL en cas de besoin :)
Et je m'en fous de l'index, ma table est pas trop grosse ...  
 
merci à toi guybrush (Threepwood) !

Reply

Sujets relatifs:

Leave a Replay

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