|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() rio ugo Inscription : avril 2010 Messages : 11 ![]() |
Bonsoir,
Je cherche à ordonner les résultats d'une requête SQL selon trois critères, intervenant sur plusieurs colonnes. Je suis arrivé ... presque au résultat escompté ... presque ! Résultat escompté : - ordonner en priorité par la valeur max de plusieurs colonnes (ça ok) - puis si le champ 'offres' non vide -> ordonner ces champs non vide par un autre champ 'date_form' (ça non ok) - puis tout le reste par date_form (ça ok) Voici un code qui marche, mais qui m'ordonne les champs 'offres' non vide par je ne sais quel critère : SELECT taux95,taux96,taux97,taux99,taux100,offres,date_form FROM `annonceur2` ORDER BY GREATEST ( abs(taux95) , abs(taux96) , abs(taux97 ), abs(taux99 ), abs(taux100 ) ) DESC, offres DESC, date_form ASC Résultat : en 1er donc les taux les + élevé, viens ensuite les champs 'offres' non-vide, puis le reste par date. C'est presque bon, sauf que je ne sais comment insérer dans l'instruction ORDRE BY cette condition : IF ('offres' != "") (ORDER BY date-form ASC) ... J'ai tenté ceci mais bien sur c'est incorrect : SELECT taux95,taux96,taux97,taux99,taux100,offres,date_form FROM `annonceur2` ORDER BY GREATEST ( abs(taux95) , abs(taux96) , abs(taux97 ), abs(taux99 ), abs(taux100 ) ) DESC, if(offres<>"") date_form ASC, date_form ASC Cela dépasse mes connaisances et j'avoue avoir pas mal chercher ici et là, ce n'est pas facile de trouver ce cas particulier ... Il faudrait l'inverse de l'instruction IF (ISNULL( ... ) ... reconnu par MySQL mais je ne trouve pas. A titre d'exemple mais ça ne correspond pas à ce que je cherche, voici une requête qui à l'air de fonctionner et de s'y approcher : ORDER BY IF(ISNULL(order_column), "", order_column) ASC, name_column DESC Merci de votre aide ! ugo |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 531 ![]() |
Saluton,
Tout d'abord j'espère que les colonnes taux95,taux96,taux97,taux99 et taux100 de la table annonceur2 sont indexés, sinon, bonjour les perfs ! Ensuite, s'agissant de la colonne offres je ne comprends pas tout de ta problématique et d'ailleurs il nous faudrait savoir si cette colonne est déclarée NOT NULL. Tu voudrais, si cette colonne contient qqe chose, faire un classement ASCendant sur ce contenu, sinon un classement ASCendant sur la colonne date_form et, de toutes façons ensuite ce classement ASCendant sur la colonne date_form. Ce potentiel classement double sur la colonne date_form risque de se heurter à l'incompréhension de MySQL.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#3 |
|
Invité de passage
![]() rio ugo Inscription : avril 2010 Messages : 11 ![]() |
Bonjour,
Merci de ta réponse. La colonne 'offres' n'a pas été déclarée NOTNULL à la création, mais je peux rajouter ça maintenant sans écraser les valeurs inscrites ? Non en fait la problématique est + simple : - Si la colonne 'offres' contient quelque-chose, trier selon date_form (ou au pire 'id' qui est primary key en autoincrement donc il me semble sur cela reprend l'ordre chronolique d'inscritpion dans la base) - Puis le reste selon date_form Is it possible ? Thanx ugp |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
Bonjour,
Quand "offres" ne contient rien est-ce NULL ou chaine vide ou 0 ou ...? |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() rio ugo Inscription : avril 2010 Messages : 11 ![]() |
Quand le champ 'offres' n'a pas été renseigné il n'y a rien dedans ...
Sinon c'est du texte (varchar) Qu'est-ce que je peux faire, rajouter un 'default' NULL ou '0' ou '' ? Sans écraser les valeurs lorsque présentes ? |
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
"rien dedans" ne veux rien dire : soit c'est null soit c'est chaîne vide.
Bref il faudrai bidouiller un peu ta requête pour rajouter une nouvelle colonne dans le select : exemple Code :
|
||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() rio ugo Inscription : avril 2010 Messages : 11 ![]() |
Ok c'est une colonne virtuelle, je ne maitrise pas cela ...
Si j'essaye de décrypter en langage 'humain', je suis curieux j'aime bien apprendre et comprendre ... : Si (offre vide) alors -> nouvelle colonne 'dt_offre' contenant une très vieille date Sinon ... 'dt_offre' = contenu de 'offres' ... ?? Et un tri par 'dt_offre' DESC ... - Si 'offres' vide -> vieille date - sinon ('dt_offre' = date_form) puisque je souhaite si (offre présente) trier par 'date_form' ... Non ? Est-ce que de cette manière les vieilles dates identiques seront classées par 'date_form', obeissant à la dernière instruction 'order' : ORDER BY ... dt_offre DESC, date_form ? Ca à l'air super cette solution, merci ! |
|
|
00
|
|
|
#8 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
Bonjour,
Pour décrypter, la nouvelle colonne aura 2 valeurs possibles : - soit la date 1900-01-01 quand (pour cette ligne là) la colonne offres est vide - soit la date "date_forme" quand (pour cette ligne là) la colonne offres n'est pas vide Citation:
|
|
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() rio ugo Inscription : avril 2010 Messages : 11 ![]() |
super !
![]() merci j'avais mal lu tes instructions, je suis pas réveillé, effectivement c'est pil poil ce qu'il faudrait, je suis content d'avoir appris quelquechose d'intéressant. Je test ça tout de suite si ok je passe en résolu ! |
|
|
00
|
|
|
#10 | ||
|
Invité de passage
![]() rio ugo Inscription : avril 2010 Messages : 11 ![]() |
Ah, petite erreur qu'est qu'il ne lui va pas :
syntax to use near '%Y-%m-%d) Instruction : Code :
|
||
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() rio ugo Inscription : avril 2010 Messages : 11 ![]() |
Mission accomplie !
Merci PunkOFF ! Bonne journée, t'as fais un heureux ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com