Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/12/2011, 23h53   #1
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
Par défaut Requête ORDER BY Multiple Columns

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
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 06h51   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 09h16   #3
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
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
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 09h22   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Quand "offres" ne contient rien est-ce NULL ou chaine vide ou 0 ou ...?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 09h28   #5
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
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 ?
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 09h54   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
"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 :
1
2
3
4
5
 
SELECT mes_col, case when (offres IS NULL OR offres = '') then str_to_date('1900-01-01', %Y-%m-%d) else date_form end AS dt_offre, date_form 
FROM ..
WHERE ...
ORDER BY ..., dt_offre DESC, date_form
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 10h01   #7
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
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 ...

Pour arriver au résultat voulu, il faudrait plutôt (je me trompe peut-être) :

- 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 !
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 10h12   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
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:
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
oui
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 10h17   #9
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
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 !
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 10h23   #10
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
Ah, petite erreur qu'est qu'il ne lui va pas :

syntax to use near '%Y-%m-%d)


Instruction :

Code :
1
2
3
4
5
6
7
 
SELECT taux95,taux96,taux97,taux99,taux100,offres,
case when (offres IS NULL OR offres = '') then str_to_date('2020-01-01',%Y-%m-%d) 
else date_form 
end AS dt_offre,
date_form 
 FROM `annonceur2` ORDER BY greatest( abs(taux95) , abs(taux96) , abs(taux97), abs(taux99), abs(taux100) ) DESC, dt_offre ASC, date_form ASC
J'ai remplacé par car le champ date_form contient la date avec ce format ...
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 10h29   #11
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
Mission accomplie !

Merci PunkOFF !

Bonne journée, t'as fais un heureux !
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h03.


 
 
 
 
Partenaires

Hébergement Web