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 :

Probleme Order By selon Condition [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 689
    Points : 1 960
    Points
    1 960
    Par défaut Probleme Order By selon Condition
    Bonjour all,
    Je cherche a creer une requete sql particuliere avec un order by selon une condition.
    (meme pas sur que ce soit faisable)

    Voici un exemple beaucoup plus parlant :

    - 3 tables : a=data, b=lieux1, c=lieux2
    - dans data : a.id, a.type_lieux, a.numero_lieux
    - dans lieux1 : b.id, b.nom
    - dans lieux2 : c.id, c.nom
    (a.type_lieux = 1 pour lieux1 / 2 pour lieux2)
    (a.numero_lieux = b.id pour lieux1 / c.id pour lieux2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = 'SELECT id, type_lieux, numero_lieux
                FROM a
                ORDER BY (c'est ici que je flanche, car je veux que ce soit trie par le nom (soit de b, soit de c) selon la valeur de a.type_lieux)';
    J'ai essaye avec un inner join, mais ...

    Merci pour votre aide et informations sur ce cas.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    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 338
    Points : 39 734
    Points
    39 734
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Utilisez un case dans le tri :

    ORDER BY CASE WHEN...

  3. #3
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 689
    Points : 1 960
    Points
    1 960
    Par défaut
    Ok pour case when, mais comment integrer les 2 autres tables dans la requete ?
    Tu aurais un exemple concret ?
    Merci pour ton aide.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    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 338
    Points : 39 734
    Points
    39 734
    Billets dans le blog
    9
    Par défaut
    Je n'avais pas bien lu la description des tables. Visiblement, pour une ligne dans "DATA" il y a soit une ligne dans "LIEUX1" soit une ligne dans "LIEUX2" mais jamais les deux, c'est bien ça ?

    Auquel cas, pas besoin de CASE, utilisez deux jointures outer (vous n'aviez pas de jointure dans votre requête d'où ma méprise) et COALESCE pour le tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       select DA.ID
            , DA.type_lieux
            , DA.numero_lieux
            , coalesce(L1.nom, L2.nom)
       from T_DATA as DA
       left join lieux1 as L1
         on L1.id=DA.numero_lieux
       left join lieux2 as L2
         on L2.id=DA.numero_lieux
       order by coalesce(L1.nom, L2.nom)

  5. #5
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 689
    Points : 1 960
    Points
    1 960
    Par défaut
    Oui c'est ca, c'est soit l'un soit l'autre, jamais les 2.

    J'avais avance en rajoutant les 2 left join, mais je butais tjrs pour le tri, car je n'arrivais tjrs pas a combiner les 2.
    Je viens de voir ton code et ca a l'air d'etre effectivement ce que je recherche a faire.
    (je ne connaissais meme pas le coalesce !!!)
    Je vais tester sur le champs.

    Un immense merci

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    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 338
    Points : 39 734
    Points
    39 734
    Billets dans le blog
    9
    Par défaut
    COALESCE (col1, col2, ..., coln) récupère la première colonne non nulle de la liste entre parenthèses
    On peut bien sur combiner des colonnes et une constante : COALESCE(montant1, montant2, 0) ==> si montant1 est null et monant 2 aussi, on récupère zéro
    Dans votre cas, puisque la jointure se fait soit avec LIEUX1 soit avec LIEUX2, l'une des deux colonnes sera marquée "nul" d'où l'intérêt de COALESCE

  7. #7
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 689
    Points : 1 960
    Points
    1 960
    Par défaut
    Fantastique.
    Ca fonctionne exactement comme je le voulais.
    Encore un immense merci escartefigue.

  8. #8
    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 464
    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 464
    Points : 19 453
    Points
    19 453
    Par défaut
    Salut à tous.

    Tout simplement cet exemple :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `data`
    --------------
     
    --------------
    CREATE TABLE `data`
    ( `id`           integer  unsigned NOT NULL auto_increment PRIMARY KEY,
      `type_lieu`    tinyint  unsigned NOT NULL,
      `numero_lieu`  tinyint  unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `data` (`type_lieu`,`numero_lieu`) values
      (1,1),(2,2),(1,2),(2,1),(1,4),(2,3)
    --------------
     
    --------------
    select * from `data`
    --------------
     
    +----+-----------+-------------+
    | id | type_lieu | numero_lieu |
    +----+-----------+-------------+
    |  1 |         1 |           1 |
    |  2 |         2 |           2 |
    |  3 |         1 |           2 |
    |  4 |         2 |           1 |
    |  5 |         1 |           4 |
    |  6 |         2 |           3 |
    +----+-----------+-------------+
    --------------
    DROP TABLE IF EXISTS `lieux1`
    --------------
     
    --------------
    CREATE TABLE `lieux1`
    ( `id`   integer unsigned NOT NULL auto_increment PRIMARY KEY,
      `nom`  varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `lieux1` (`nom`) values
      ('un'),  ('deux'),  ('trois'),  ('quatre')
    --------------
     
    --------------
    select * from `lieux1`
    --------------
     
    +----+--------+
    | id | nom    |
    +----+--------+
    |  1 | un     |
    |  2 | deux   |
    |  3 | trois  |
    |  4 | quatre |
    +----+--------+
    --------------
    DROP TABLE IF EXISTS `lieux2`
    --------------
     
    --------------
    CREATE TABLE `lieux2`
    ( `id`   integer unsigned NOT NULL auto_increment PRIMARY KEY,
      `nom`  varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `lieux2` (`nom`) values
      ('one'),  ('two'),  ('three'),  ('four')
    --------------
     
    --------------
    select * from `lieux2`
    --------------
     
    +----+-------+
    | id | nom   |
    +----+-------+
    |  1 | one   |
    |  2 | two   |
    |  3 | three |
    |  4 | four  |
    +----+-------+
    --------------
    select           t1.id,
                     t1.type_lieu,
                     t1.numero_lieu,
                     case t1.type_lieu when 1 then t2.nom when 2 then t3.nom else NULL end as nom
     
               from  `data` as t1
     
    left outer join  `lieux1` as t2
                 on  t2.id = t1.numero_lieu
     
    left outer join  `lieux2` as t3
                 on  t3.id = t1.numero_lieu
     
      order by  nom
    --------------
     
    +----+-----------+-------------+--------+
    | id | type_lieu | numero_lieu | nom    |
    +----+-----------+-------------+--------+
    |  3 |         1 |           2 | deux   |
    |  4 |         2 |           1 | one    |
    |  5 |         1 |           4 | quatre |
    |  6 |         2 |           3 | three  |
    |  2 |         2 |           2 | two    |
    |  1 |         1 |           1 | un     |
    +----+-----------+-------------+--------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Il est inutile de passer par un "order by case ..." ou par un "coalesce()".

    @+

  9. #9
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 689
    Points : 1 960
    Points
    1 960
    Par défaut
    Interressant aussi d'utiliser un case direct dans le select.
    Maintenant, la question qui tue : laquelle est la moins gourmande ?

  10. #10
    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 464
    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 464
    Points : 19 453
    Points
    19 453
    Par défaut
    Salut Danyel.

    A vous de choisir !

    @+

  11. #11
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 689
    Points : 1 960
    Points
    1 960
    Par défaut
    hihi un immense merci a toi

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

Discussions similaires

  1. [MySQL] probleme pour updater selon condition php
    Par serna dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/02/2013, 13h32
  2. [PROCEDURE STOCKEE] ORDER BY Selon condition
    Par freud dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/07/2007, 14h41
  3. [VB.net] Générer une date selon condition
    Par WriteLN dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/10/2005, 16h12
  4. [VB.NET] Changer de classe selon condition
    Par daner06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/10/2004, 10h04
  5. DLLs chargées selon condition
    Par Benjamin GAGNEUX dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 12/08/2004, 18h14

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