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 :

ORDER BY une valeur à calculer


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut ORDER BY une valeur à calculer
    Bonjour,

    J'ai cherché en vain une bonne doc sur ORDER BY.

    J'ai un champ 'syaa' dont les valeurs subissent un traitement dans le SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Requête PHP :
    SELECT IF(LOCATE('" . $pos . "',syaa)<>0,SUBSTRING(syaa,LOCATE('" . $pos . "',syaa)+2,3),syaa) AS syaa
    Je veux ensuite faire un ORDER BY syaa mais en faisant subir le même traitement et je me demande comment faire.

    Pour être concret, syaa peut :
    être une suite de 3 lettres : emi
    ou
    ou être une suite de 3 lettres mais précédée de deux caractères : H1ami

    Pour le tri, je veux ami avant emi, donc débarrasser H1ami de H1 comme je le fais dans le SELECT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY IF (LOCATE('" . $pos . "',syaa)<>0,SUBSTRING(syaa,LOCATE('" . $pos . "',syaa)+2,3),syaa)
    Je vais essayer cela.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    A tester, je sais pas si ça marche, mais à l'intuition j'aurais donné un alias différent du nom du champ (pour être que pas de confusion), et j'aurais fait l'ORDER BY directement sur l'alias.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Si la colonne calculée est toujours de même structure, il est facile de faire un tri sur une partie de cette colonne.
    Dans l'exemple ci-après, je fais la concaténation de deux colonnes, où la valeur de la première colonne peut être absente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    select * from test
    --------------
     
    +----+-----+------+
    | id | one | two  |
    +----+-----+------+
    |  1 | ame | 16   |
    |  2 | erg | 12   |
    |  3 | duo | 13   |
    |  4 | duo | NULL |
    |  5 | erg | 10   |
    |  6 | ame | NULL |
    +----+-----+------+
    --------------
    select concat(case when two is null then '' else two end, one) as val from test order by right(val,3), left(val, 2)
    --------------
     
    +-------+
    | val   |
    +-------+
    | 16ame |
    | ame   |
    | 13duo |
    | duo   |
    | 10erg |
    | 12erg |
    +-------+
    --------------
    select concat(case when two is null then '' else two end, one) as val from test order by one, two
    --------------
     
    +-------+
    | val   |
    +-------+
    | ame   |
    | 16ame |
    | duo   |
    | 13duo |
    | 10erg |
    | 12erg |
    +-------+
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Merci de vos réponses.

    Citation Envoyé par sevyc64 Voir le message
    A tester, je sais pas si ça marche, mais à l'intuition j'aurais donné un alias différent du nom du champ (pour être que pas de confusion), et j'aurais fait l'ORDER BY directement sur l'alias.
    Ce n'est pas bête.
    En plus tu économises une opération car je suppose que SUBSTRING(syaa,LOCATE('" . $pos . "',syaa)+2,3) n'est exécuté qu'une seule fois au lieu de deux.
    L'inconvénient est que je dois derrière modifier mes scripts pour dire que syaa est remplacé par son nouveau nom mais ce n'est pas trop compliqué.

    Je vais faire les tests.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut boteha.

    Je crois que tu n'as pas bien compris la solution proposé par sevyc64.

    Quand tu écrits par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF(LOCATE('" . $pos . "',syaa)<>0,SUBSTRING(syaa,LOCATE('" . $pos . "',syaa)+2,3),syaa) AS syaa
    le "sysaa" est déjà un alias puisque tu écris "as sysaa".

    Donc tu as une confusion entre la colonne "nom_de_ta_table.syaa" et l'alias "syaa".
    Sur ce point, je te conseille vivement de ne pas mettre le même nom de colonne pour l'alias.

    Il suffit simplement de faire référence à cet alias dans le "order by" comme ci-après :
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Effectivement je n'avais pas compris.

    Je fais donc un test avec juste ORDER BY syaa et si cela ne fonctionne pas je change le nom de l'alias.

    Je vous tiens informés.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Tu peut aussi faire un ORDER BY positionnel... Comme tu n'as pas posté l'intégralité de ta requête, difficile de t'aider plus.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Je viens de faire un test avec ORDER BY syaa et cela fonctionne bien.

    Pour info, une requête possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = "SELECT IF(LOCATE('" . $k . "',syaa)<>0,SUBSTRING(syaa,LOCATE('" . $k . "',syaa)+2,3),syaa) AS syaa, po_id FROM matable WHERE category LIKE '%$k%' AND syaa<>'' ORDER BY syaa";
    PS : je ne sais pas ce qu'est un ORDER BY positionnel, je vais me renseigner.

    MERCI beaucoup pour votre aide.

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Boteha.

    Soit le select suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select col3, col1, col2 from test;
    Vous pouvez faire un order by positionnel en indiquant tout simplement la position dans le select, de la colonne que vous désirez trier.
    Par exemple, au lieu de mettre col1, vous indiquea que c'est la deuxième colonne dans le select. Et cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select col3, col1, col2 from test order by 2;
    En espérant que vous ayez compris mon exemple.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour Artemus24,

    Ton exemple est très clair.

    MERCI.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour Artemus24,

    J'ai réglé mon problème de tri et j'en suis bien content.

    Dernier détail, dans l'exemple que tu donnes, je ne comprends pas cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by right(val,3), left(val, 2)
    As-tu un lien vers la doc MySQL où c'est expliqué, moi je n'ai pas trouvé ?

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    VAL est le nom (alias) donné au résultat de la concaténation produit par
    concat(case when two is null then '' else two end, one) as val

    ORDER BY est l'instruction de tri et right(val,3), left(val, 2) en sont les paramètres : tri selon les 3 caractères de droite, puis les 2 caratères de gauche de VAL

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Merci de ta réponse.

    En admettant que val prenne ces valeurs, je fais exprès d'y mettre plus de 5 caractères.

    ami0052
    ami1147
    emi0015

    Le tri donnerait :

    ami1147
    ami0052
    emi0015

    C'est bon à savoir.

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut boteha.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by right(val,3), left(val, 2)
    Le tri va se faire ainsi :

    1) d'abord on traite "right(val,3)".
    Cela signifie que l'on prend la partie de droite sur trois caractères. Exemple :
    2) en sur l'égalité de cette partie de droite, on traite ensuite "left(val, 2)". Exemple :
    Trier sur les valeurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ami0052
    ami1147
    emi0015
    donne le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    emi0015
    ami0052
    ami1147
    J'ai mis en rouge le "right(val,3)" et en bleu le "left(val, 2)".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Encore merci.

    C'est bien ce que j'avais compris mais j'ai confondu la droite et la gauche...

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/12/2006, 01h02
  2. stocker definitivement une valeur calculée
    Par acipeg dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 28/11/2006, 16h46
  3. Réponses: 3
    Dernier message: 30/06/2006, 09h41
  4. Affichage dynamique d'une valeur calculée
    Par harley dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/06/2006, 09h20
  5. [PHP-JS] Affichage d'une valeur calculée
    Par harley dans le forum Langage
    Réponses: 3
    Dernier message: 02/06/2006, 09h39

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