mysql - order by multi champs

Le
Anthony
Si quelqu'un peut m'aider sur ce point (sachant que je ne peux pas
toucher la structure de la base mysql).

j'ai une table avec des champs de type varchar : titre1, titre2, titre3

Je voudrais que dans mon select l'ordre s'affiche comme tel :

ORDER BY titre1,titre2,titre3 (mais sans tenir compte des champs vides )

Si j'ai :

ID1 => '','zzzz','zzzz'
ID2 => 'bbbb','',''
ID3 => '','xxxx','yyyy'
ID4 => 'aaaa','yyyy','zzzz'

Il faudrait qu'il me retourne :

1=> 'aaaa','yyyy','zzzz'
2=> 'bbbb','',''
3=> '','xxxx','yyyy'
4=> '','zzzz','zzzz'

Je ne sais pas si j'ai été clair

Anthony
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Ph. B.
Le #22935541
Anthony a écrit :
Si quelqu'un peut m'aider sur ce point (sachant que je ne peux pas
toucher la structure de la base mysql).

j'ai une table avec des champs de type varchar : titre1, titre2, titre3

Je voudrais que dans mon select l'ordre s'affiche comme tel :

ORDER BY titre1,titre2,titre3 (mais sans tenir compte des champs vides )

Si j'ai :

ID1 => '','zzzz','zzzz'
ID2 => 'bbbb','',''
ID3 => '','xxxx','yyyy'
ID4 => 'aaaa','yyyy','zzzz'

Il faudrait qu'il me retourne :

1=> 'aaaa','yyyy','zzzz'
2=> 'bbbb','',''
3=> '','xxxx','yyyy'
4=> '','zzzz','zzzz'

Je ne sais pas si j'ai été clair...

Anthony



Bonjour,

Je suppose que les colonnes titre1 à titre3 peuvent être indéfinies (=
NULL) donc j'utiliserais les fonctions :
_coalesce(valeur1, ..., valeurN) qui renvoie la 1° valeur non NULL et
à défaut NULL
_concat(chaine1, ..., chaineN) qui concatène plusieurs chaines

Et j'écrirais :

SELECT
*
FROM
ma_table
ORDER BY
concat(coalesce(titre1, ''),
coalesce(titre2, ''),
coalesce(titre3, ''))

A adapter en fonction des besoins, consultez la doc de Mysql pour en
savoir plus... ;-)
--
Philippe.
Anthony
Le #22935601
Le 17/12/2010 17:44, Ph. B. a écrit :

Je suppose que les colonnes titre1 à titre3 peuvent être indéfinies ( > NULL) donc j'utiliserais les fonctions :



malheureusement les concepteurs de la base ont laissé les champs vides
... mais pas NULL

Anthony
Ph. B.
Le #22935651
Anthony a écrit :
Le 17/12/2010 17:44, Ph. B. a écrit :

Je suppose que les colonnes titre1 à titre3 peuvent être indéfinies ( >> NULL) donc j'utiliserais les fonctions :



malheureusement les concepteurs de la base ont laissé les champs vides
... mais pas NULL

Anthony



Si tu es certain que les colonnes titre1 à titre3 ne peuvent contenir la
"valeur" NULL, tu peux écrire :

ORDER BY
concat(titre1, titre2, titre3)

Par sécurité, bien que cela peut augmenter les temps de réponse, je
garderai la 1° solution :

ORDER BY
concat(coalesce(titre1, ''),
coalesce(titre2, ''),
coalesce(titre3, ''))

--
Philippe.
Anthony
Le #22935721
Bon voilà la pirouette que j'ai exécuté pour pallier à mon problème :

SELECT id,IF(titre1 = '', IF(titre2='',titre3,titre1),titre1) AS titre,
FROM `base` ORDER BY `titre` DESC

ça semble tourner... en sachant que si tout est vide j'utilise titre1...

Anthony


Le 17/12/2010 18:14, Ph. B. a écrit :
Anthony a écrit :
Le 17/12/2010 17:44, Ph. B. a écrit :

Je suppose que les colonnes titre1 à titre3 peuvent être indéfinies ( >>> NULL) donc j'utiliserais les fonctions :



malheureusement les concepteurs de la base ont laissé les champs vides
... mais pas NULL

Anthony



Si tu es certain que les colonnes titre1 à titre3 ne peuvent contenir la
"valeur" NULL, tu peux écrire :

ORDER BY
concat(titre1, titre2, titre3)

Par sécurité, bien que cela peut augmenter les temps de réponse, je
garderai la 1° solution :

ORDER BY
concat(coalesce(titre1, ''),
coalesce(titre2, ''),
coalesce(titre3, ''))

Anthony
Le #22935821
Le 17/12/2010 18:26, Anthony a écrit :
SELECT id,IF(titre1 = '', IF(titre2='',titre3,titre1),titre1) AS titre,
FROM `base` ORDER BY `titre` DESC



oups je voulais dire :

SELECT id,IF(titre1 = '', IF(titre2='',titre3,titre2),titre1) AS titre,
FROM `base` ORDER BY `titre` DESC

me suis embrouillé dans les titre :-)

anthony
Publicité
Poster une réponse
Anonyme