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 :

utilisation d'une condition


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut utilisation d'une condition
    Bonjour,

    je possède 2 tables ayant les structures suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE IF NOT EXISTS `lister` (
      `NUM_SITE_THEORIQUE` varchar(11) NOT NULL,
      `NUM_SITE_GEO` varchar(11) NOT NULL,
      `NUM_CI` int(11) NOT NULL,
      `STATUT_POTENTIEL` varchar(11) NOT NULL,
      `TYPE_SITE_THEORIQUE` varchar(11) NOT NULL,
      `prio` int(2) NOT NULL,
      KEY `NUM_SITE_GEO` (`NUM_SITE_GEO`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE IF NOT EXISTS `v_abis_routage` (
      `Routage_Order` int(2) NOT NULL,
      `Equipement#` varchar(11) NOT NULL,
      `SiteGeo_Equipement` varchar(11) NOT NULL,
      `SiteGeo_Routage` varchar(11) NOT NULL,
      KEY `SiteGeo_Routage` (`SiteGeo_Routage`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Le champ `prio` contient l'une des 4 valeurs: 1, 2, 3 ou 4.
    Et un champ `NUM_SITE_GEO` peut avoir plusieurs prio

    Voici l'exemple du site "SI147196" qui possède prio=3 et prio=1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO `lister` (`NUM_SITE_THEORIQUE`, `NUM_SITE_GEO`, `NUM_CI`, `STATUT_POTENTIEL`, `TYPE_SITE_THEORIQUE`, `prio`) VALUES
    ('T18166', 'SI147196', 318008, 'Vivant', 'BSC', 3),
    ('T18237', 'SI147196', 318266, 'Vivant', 'RN_', 1),
    Ce que j'aimerais faire c'est sélectionner les enregistrements ayant la plus haute valeur de 'prio'.
    Pour le cas du site 'SI147196', je prend la ligne pour laquelle prio=3 et pas prio=1. Si je n'avais pas prio=3, je prendrais la ligne pour laquelle prio=1.

    J'espère que je me suis fait comprendre.

    Voilà un début de requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT v_abis_routage.Routage_Order, v_abis_routage.`Equipement#`, v_abis_routage.SiteGeo_Equipement, v_abis_routage.SiteGeo_Routage, lister.NUM_SITE_THEORIQUE, lister.TYPE_SITE_THEORIQUE
    FROM v_abis_routage, lister
    WHERE v_abis_routage.SiteGeo_Routage=lister.NUM_SITE_GEO
    Quelle est la requête à utiliser? Merci à vous.

    Cordialement.

  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 : 73
    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,
    Je pense à un truc comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT v_abis_routage.Routage_Order, 
           v_abis_routage.`Equipement#`, 
           v_abis_routage.SiteGeo_Equipement, 
           v_abis_routage.SiteGeo_Routage, 
           l2.NUM_SITE_THEORIQUE, 
           l2.TYPE_SITE_THEORIQUE
    FROM v_abis_routage,
        (SELECT lister.NUM_SITE_THEORIQUE,
                lister.TYPE_SITE_THEORIQUE,
                lister.NUM_SITE_GEO
         FROM lister
         WHERE lister.NUM_SITE_GEO=v_abis_routage.SiteGeo_Routage
         ORDER BY LISTER.prio DESC 
         LIMIT 1) AS l2
    Mais ça utilise une sous-requête corrélée et je ne suis pas sûr que la corrélation (qui n'est déjà pas trop recommandée avec MyQSL pour des raisons de performance) va fonctionner.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Je pense à un truc comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT v_abis_routage.Routage_Order, 
           v_abis_routage.`Equipement#`, 
           v_abis_routage.SiteGeo_Equipement, 
           v_abis_routage.SiteGeo_Routage, 
           l2.NUM_SITE_THEORIQUE, 
           l2.TYPE_SITE_THEORIQUE
    FROM v_abis_routage,
        (SELECT lister.NUM_SITE_THEORIQUE,
                lister.TYPE_SITE_THEORIQUE,
                lister.NUM_SITE_GEO
         FROM lister
         WHERE lister.NUM_SITE_GEO=v_abis_routage.SiteGeo_Routage
         ORDER BY LISTER.prio DESC 
         LIMIT 1) AS l2
    je pense que ta requête n'est pas correcte car son exécution me donne uniquement des enregistrements ou 'prio=4', pire encore, si un enregistrement a une prio=3 , 2 ou 1 elle va lui affecter prio=4. Ce qui ne répond pas à mon besoin.

    y aurait-il pas une autre méthode avec l'utilisation de IF, CASE... ou un truc du genre. merci.

    Cordialement.

  4. #4
    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 : 73
    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
    Il semble que la corrélation s'opère mais qu'il faille quand même une jointure
    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
    SELECT v_abis_routage.Routage_Order, 
           v_abis_routage.`Equipement#`, 
           v_abis_routage.SiteGeo_Equipement, 
           v_abis_routage.SiteGeo_Routage,
           l2.prio,
           l2.NUM_SITE_THEORIQUE, 
           l2.TYPE_SITE_THEORIQUE
    FROM v_abis_routage,
    INNER JOIN (SELECT lister.NUM_SITE_THEORIQUE,
                lister.TYPE_SITE_THEORIQUE,
                lister.NUM_SITE_GEO,
                lister.prio
         FROM lister
         WHERE lister.NUM_SITE_GEO=v_abis_routage.SiteGeo_Routage
         ORDER BY lister.prio DESC 
         LIMIT 1) AS l2
    ON l2.NUM_SITE_GEO=v_abis_routage.SiteGeo_Routage
    C'est très bourrin puisqu'on filtre sur NUM_SITE_GEO et qu'on jointure aussi dessus.
    A voir, pas du tout sûr de mon coup.

  5. #5
    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 : 73
    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
    Bon, je me suis fait une petit base de test pour essayer de comprendre en quoi je partais en vrille.
    J'ai trouvé une solution, mais elle me semble assez bourrinasse
    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
    SELECT v_abis_routage.Routage_Order, 
           v_abis_routage.`Equipement#`, 
           v_abis_routage.SiteGeo_Equipement, 
           v_abis_routage.SiteGeo_Routage,
           (SELECT lister.prio
            FROM lister
            WHERE lister.NUM_SITE_GEO=v_abis_routage.SiteGeo_Routage
            ORDER BY lister.prio DESC 
            LIMIT 1) AS prio,
           (SELECT lister.NUM_SITE_THEORIQUE
            FROM lister
            WHERE lister.NUM_SITE_GEO=v_abis_routage.SiteGeo_Routage
            ORDER BY lister.prio DESC 
            LIMIT 1) AS NUM_SITE_THEORIQUE, 
           (SELECT lister.TYPE_SITE_THEORIQUE
            FROM lister
            WHERE lister.NUM_SITE_GEO=v_abis_routage.SiteGeo_Routage
            ORDER BY lister.prio DESC 
            LIMIT 1) AS TYPE_SITE_THEORIQUE
    FROM v_abis_routage
    Bon alors là on fait carrément trois sous-requêtes corrélées directement dans la clause SELECT.
    Si chaque NUM_SITE_GEO n'est bien présent qu'une seule fois dans v_abis_routage ça devrait le faire, mais j'espère que tes tables ne sont pas gigantesquissimes.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup ta dernière requête marche
    Tu n'es peut être pas le meilleur mais tu es parmi les meilleurs!

    à+

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

Discussions similaires

  1. utilisation d'une condition de date
    Par Paolo. dans le forum C#
    Réponses: 3
    Dernier message: 13/05/2014, 15h09
  2. [Smarty] utilisation d'une condition dans une balise
    Par tabbabi dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 01/08/2012, 12h58
  3. débutant RMAN et l'utilisation d'une condition IF
    Par gold15 dans le forum PL/SQL
    Réponses: 0
    Dernier message: 04/02/2010, 17h57
  4. [ireport] - utiliser une condition sur un field
    Par karibouxe dans le forum iReport
    Réponses: 11
    Dernier message: 15/02/2007, 16h48
  5. Somme d'enregistrements utilisant une condition
    Par Tartenpion dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/09/2005, 15h38

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