Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

mysql - order by multi champs

5 réponses
Avatar
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

5 réponses

Avatar
Ph. B.
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.
Avatar
Anthony
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
Avatar
Ph. B.
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.
Avatar
Anthony
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, ''))

Avatar
Anthony
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