IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête ORDER BY Multiple Columns


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : Avril 2010
    Messages : 29
    Points : 39
    Points
    39
    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

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    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)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : Avril 2010
    Messages : 29
    Points : 39
    Points
    39
    Par défaut
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Quand "offres" ne contient rien est-ce NULL ou chaine vide ou 0 ou ...?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : Avril 2010
    Messages : 29
    Points : 39
    Points
    39
    Par défaut
    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 ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    "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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : Avril 2010
    Messages : 29
    Points : 39
    Points
    39
    Par défaut
    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 !

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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

    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

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : Avril 2010
    Messages : 29
    Points : 39
    Points
    39
    Par défaut
    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 !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : Avril 2010
    Messages : 29
    Points : 39
    Points
    39
    Par défaut
    Ah, petite erreur qu'est qu'il ne lui va pas :

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


    Instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : Avril 2010
    Messages : 29
    Points : 39
    Points
    39
    Par défaut
    Mission accomplie !

    Merci PunkOFF !

    Bonne journée, t'as fais un heureux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme sur requête avec order by multiple
    Par dembroski dans le forum Requêtes
    Réponses: 25
    Dernier message: 28/01/2010, 15h47
  2. requéte order by double?
    Par kanzarih dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/05/2006, 20h25
  3. Calcul requête avec conditions multiples
    Par Phullbrick dans le forum Access
    Réponses: 7
    Dernier message: 18/04/2006, 13h45
  4. Requête d'insertion multiple avec 1 valeur fixe
    Par [DreaMs] dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/12/2005, 09h28
  5. requête order by + group by ?
    Par isa38 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/07/2005, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo