option de tri dans une requête mysql

WRInaute discret
bonjour,

j'ai un champ date dans une table qui est parfois vide, je voudrais trier les résultats par date (order by date) mais en affichant les résultats vides à la fin.
exemple avec les champs dates enregistrés dans la table :
1) 0
2) 2006-07-01
3) 2006-06-01

m'affiche
> 2006-06-01
> 2006-07-01
> 0

merci -)

Mikaël
 
WRInaute accro
dans le pire des cas, tu peux faire la requete deux fois, une fois les non vide triés, et une seocnde fois les vide :) sinon tu peux faire la requete une fois, les recuperer dans un tableau, trier le tableau et l'afficher

si ca se fait en sql, je ne sais po le faire
 
WRInaute occasionnel
Lorsque tu boucles sur les résultats de ta requête, il suffit de commencer la lecture par la fin et non par le début.

Je ne sais pas si c'est suffisamment clair :?
 
WRInaute discret
Fait un update de tes valeurs de 0 à 9999-99-99 ^^

Sinon sérieusement avec un petit if ou union ca doit être possible ;)
 
WRInaute discret
ouais dmx, j'ai pensé à faire ça, mais ca va mettre le b... dans une autre requête je me sers des champs qui ne sont pas nuls, et je veux pas retoucher à mon code (qui fait deja qqs centaines de lignes)...
 
WRInaute discret
Tu ne peux pas faire en sorte que lors d'un tri de champ de dates (numérique) seul un un zero soit trié inversement à la logique.

Il te faudra faire deux requettes:
 
WRInaute discret
Est-ce qu'il y a une réelle nécessité de récuperer les dates vides ??? Parce qu'un simple "WHERE date <>'0' ORDER BY Date" devrait suffir dans ce cas.

Sinon, essaye ça
SELECT * FROM Table1 WHERE Date <> '0' ORDER BY Date
UNION
SELECT * FROM Table1 WHERE Date= '0'

(A corriger par les spécialistes si je me suis raté dans l'écriture )
 
WRInaute discret
non, si je fais order by date ASC, ca m'affiche les champs vides au départ... or je les veux a la fin

et si je fais un date DESC ca m'affiche bien les champs vides a la fin, mais les champs non-vides sont triés dans le sens inverse

je pense qu'il faut faire un truc du genre :
order by date (if date!='')
mais je ne connais pas la syntaxe...
 
WRInaute accro
karak> non, car il veut les DATE Desc SAUF les dates vides.

retza> un union va sortir dabord les resultats de la premiere requete, puis les seconds ?
 
WRInaute occasionnel
Dans ce cas la un traitement dans la boucle avec un if parait obligatoire.
Sinon si cela ne surcharge pas trop le serveur, une deuxieme requete.

Pour l'operateur UNION, il combine les deux resulats .
 
WRInaute discret
e-kiwi, a priori oui, puisque les requête sont lancées l'une aprés l'autre, la "vue" générée se remplie au fur et à mesure par les enregistrements correspondants...

Mais là aussi, faut voir en fonction du moteur de Bdd utilisé... je garantie pas qu'Access, SQL server ou MySQL donnent des résultats similaires :)
 
WRInaute discret
Le problème que j'ai toujours rencontré avec UNION est le respect du tri (ASC & DESC) c'est pour celà que je préfère faire deux requettes disctinctes et non en UNION.

Code:
(SELECT * FROM table1 WHERE date <> 0 ORDER BY date)
UNION
(SELECT * FROM table1 WHERE date = 0)
Ne donnera pas le resultat souhaité. (le tri de la premiere requette ne sera pas conservé)

Alors que:
Code:
SELECT * FROM table1 WHERE date <> 0 ORDER BY date
puis:
Code:
SELECT * FROM table1 WHERE Date = 0
donnera le resultat souhaité.

Je ne sais pour quelle raison mais je n'ai jamais solutionné ce problème.
 
WRInaute discret
Je viens de faire un test sous Access... ça marche correctement, mais avec un identifiant unique, et avec une seule valeur possible pour la date (soit remplie, soit vide... je sais pas si c'est clair, tout ça! )
et sans combinaisons des valeurs de 2 tables distinctes (Les exemples du liens, que j'avoues avoir lu en diagonale :) appellent des données de plusieurs tables, il me semble)
 
WRInaute discret
Oupssss... d'aprés Xou, j'ai quelques requêtes à corriger moi !!
Bon ben mea culpa si ma solution n'est pas la bonne, alors !! :oops:
 
WRInaute discret
bonne question.

je viens de faire les tests sur une table contenant 61440 enregistrements et apparement c'est même plus rapide.
 
WRInaute discret
e-kiwi, sur le principe, je pense que c'est kif-kif... Finalement, l'Union permet de joindre 2,3,... requêtes qui s'appliquent à la suite.
L'interet de la chose (plutôt que 2 requetes successives), c'est lorsque tu te sers du résultats pour d'autres traitements par la suite (pour un simple affichage, je me poserai à peine la question, les 2 requêtes conviennent trés bien ! ) :wink:
 
WRInaute accro
peut etre meme qu'un tri du tableau resultat d'une simple requete serait encore plus rapide (et allegerai la BDD en tout cas)
 
WRInaute discret
bah le problème c'est que en théorie ta solution est la bonne (excepté dans la syntaxe mais la n'est pas le problème), mais dans la pratique il en est autrement.

Et j'avoue mon incompréhension face à ce problème de tri que j'ai rencontré à plusieurs reprises.

Si quelqu'un a une explication rationelle: je suis preneur ! ;)
 
WRInaute occasionnel
Et en utilisant "UNION ALL" ?
Ca permet d'éviter de combiner les deux select et donc de conserver leurs tris. Et c'est sans risque puisque dans ton cas tu ne peux avoir de doublons.
 
WRInaute discret
Tu as entièrement raison pour l'utilisation du flag ALL; sans quoi tous les résultats ne seront pas retournés, MAIS je conserve le même problème de tri. (non conservé)
 
WRInaute occasionnel
Je viens de penser à cette solution :

Code:
(SELECT date, 'a' AS tri FROM table WHERE date != '')
UNION 
(SELECT date, 'b' AS tri FROM table WHERE date = '')
ORDER BY tri ASC, date ASC
 
Discussions similaires
Haut