Page 1 sur 1

Requête SQL impossible ?

Posté : 13 oct. 2008, 23:11
par Daviwys
Bonjour,

Est-il possible d'effectuer un "ORDER BY" sur le contenu d'une colonne ?

En faite, j'ai une table qui contient une colonne appelé "status" au format "ENUM" avec 3 contenus différents :
- VALIDE
- EN COURS
- TERMINE

Et ma requête actuelle est ainsi :
SELECT * FROM `MaTable` ORDER BY `status` ASC;

Et je voudrais afficher tous les enregistrements de ma table, mais en commençant par ceux qui ont comme status "EN COURS" par exemple.

Après moult recherche je commence à me demander si c'est possible ?

Merci.

Posté : 14 oct. 2008, 10:01
par Berzemus
Un order by sur un champ ENUM réarrange selon l'ordre des options possibles tels que définis dans ton create table (au moment de la création de la table).

Enfin, il me semble, j'ai virtuellement jamais utilisé.

Posté : 18 oct. 2008, 00:39
par Daviwys
Et bien merci pour ton message ;)

J'en conclu au passage que la réponse est "NON" à ma question.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 18 oct. 2008, 01:17
par furiouslol
Salut,
Si tu veux organiser tes résultats sans forcément suivre l'ordre de ton enum, tu peux toujours faire un UNION

Code : Tout sélectionner

(SELECT * FROM `MaTable` WHERE `status`="EN COURS ") UNION (SELECT * FROM `MaTable` WHERE `status`="VALIDE") UNION (SELECT * FROM `MaTable` WHERE `status`="TERMINE");

Posté : 18 oct. 2008, 09:37
par albat

Code : Tout sélectionner

(SELECT * FROM MaTable WHERE status="EN COURS ") UNION (SELECT * FROM MaTable WHERE status="VALIDE") UNION (SELECT * FROM MaTable WHERE status="TERMINE");
Syntaxiquement correct, mais qu'est-ce que c'est lourd !
3 scans complets de la table pour un seul et même traitement ! :sick:

Et puis le SELECT *, c'est mal... :non:

Posté : 18 oct. 2008, 10:49
par furiouslol
Oui je sais :oops:

Mais je ne sais pas comment ordonner son enum autrement en une seule requete et sans tenir compte de la structure de la table ... :lol:

Posté : 18 oct. 2008, 10:52
par albat
Mais au fait, Daviwys, qu'obtiens-tu lorsque tu exécutes ta requête ?
SELECT * FROM MaTable ORDER BY status;

Posté : 18 oct. 2008, 11:19
par Sékiltoyai
Utilise ORDER BY FIELD();

Posté : 18 oct. 2008, 13:21
par Daviwys
Salut et merci pour ces nouveaux post ;)
Mais au fait, Daviwys, qu'obtiens-tu lorsque tu exécutes ta requête ?
SELECT * FROM MaTable ORDER BY status;
elle retourne la liste de tous les enregistrements en triant dans l'ordre de mon "ENUM(VALIDE, EN COURS, TERMINE)" comme ceci :
- 5 enregistremants (VALIDE)
- 2 enregistrements (EN COURS)
- 7 enregistrements (TERMINE)

Quant à "Sékiltoyai", je te remercie "royalement" pour ton post qui correspond exactement à ce que je cherchais !

C'est fantastique de pouvoir utiliser ce type d'option dans les requêtes SQL, mais j'ai beaucoup de mal à les trouver :(

Encore merci à vous tous, et un bon week-end ;)

Posté : 18 oct. 2008, 14:15
par Sékiltoyai
Quant à "Sékiltoyai", je te remercie "royalement" pour ton post qui correspond exactement à ce que je cherchais !
De rien :)
C'est fantastique de pouvoir utiliser ce type d'option dans les requêtes SQL, mais j'ai beaucoup de mal à les trouver :(
En fait, il faut beaucoup flanner sur la doc mysql pour les connaître… Même avec une recherche je ne suis pas sur que tu aurais trouvé…

Posté : 21 oct. 2008, 12:30
par caroube
tu peux également essayer

Code : Tout sélectionner

order by FIND_IN_SET(status,'EN COURS,VALIDE,TERMINE')