option de tri dans une requête mysql

atomikado
WRInaute discret
WRInaute discret
 
Messages: 160
Inscription: 22 Sep 2003

option de tri dans une requête mysql

Message le Mar Juil 18, 2006 10:06

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


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Mar Juil 18, 2006 10:11

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


karak
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 355
Inscription: 6 Aoû 2005

Message le Mar Juil 18, 2006 10:14

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 :?
Dernière édition par karak le Mar Juil 18, 2006 10:21, édité 1 fois.


Dmx
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 256
Inscription: 7 Avr 2004

Message le Mar Juil 18, 2006 10:14

Fait un update de tes valeurs de 0 à 9999-99-99 ^^

Sinon sérieusement avec un petit if ou union ca doit être possible ;)


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Mar Juil 18, 2006 10:15

karak> non, sinon il va avoir les dates dans le mauvais ordre

atomikado
WRInaute discret
WRInaute discret
 
Messages: 160
Inscription: 22 Sep 2003

Message le Mar Juil 18, 2006 10:19

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)...


Xou
WRInaute discret
WRInaute discret
 
Messages: 187
Inscription: 2 Juin 2006

Message le Mar Juil 18, 2006 10:19

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:


karak
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 355
Inscription: 6 Aoû 2005

Message le Mar Juil 18, 2006 10:19

Normalement avec un

order by date DESC

ou

order by date ASC

Ca regle le probleme non ?

retza
WRInaute discret
WRInaute discret
 
Messages: 58
Inscription: 16 Fév 2005

Message le Mar Juil 18, 2006 10:23

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 )

atomikado
WRInaute discret
WRInaute discret
 
Messages: 160
Inscription: 22 Sep 2003

Message le Mar Juil 18, 2006 10:24

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...


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Mar Juil 18, 2006 10:25

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 ?


karak
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 355
Inscription: 6 Aoû 2005

Message le Mar Juil 18, 2006 10:31

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 .

retza
WRInaute discret
WRInaute discret
 
Messages: 58
Inscription: 16 Fév 2005

Message le Mar Juil 18, 2006 10:32

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 :)


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Mar Juil 18, 2006 10:34

retza a écrit: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 :)


t es sur ?
http://cerig.efpg.inpg.fr/tutoriel/base ... chap21.htm


Xou
WRInaute discret
WRInaute discret
 
Messages: 187
Inscription: 2 Juin 2006

Message le Mar Juil 18, 2006 10:41

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: Tout sélectionner
(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: Tout sélectionner
SELECT * FROM table1 WHERE date <> 0 ORDER BY date

puis:
Code: Tout sélectionner
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.
Dernière édition par Xou le Mar Juil 18, 2006 10:43, édité 2 fois.

option de tri dans une requête mysql

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité