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 :

Jointure avec 2 colonnes


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut Jointure avec 2 colonnes
    Bonjour,

    J'ai un problème de jointure qui me parait simple mais je n'y arrive pas ....

    Voici mes tables :

    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
     
    CREATE TABLE SERVER (
    ID_SERVER INT NOT NULL AUTO_INCREMENT,
    NAME_SERVER  VARCHAR(50) NOT NULL,
    DESC_SERVER VARCHAR(500),
    COM_SERVER VARCHAR(500),
    DATE_SERVER VARCHAR(50),
    IP_REQ_SERVER VARCHAR(50),
    PRIMARY KEY (ID_SERVER),
    UNIQUE KEY (NAME_SERVER)
    ); 
     
    CREATE TABLE APPLICATION (
    ID_APP INT NOT NULL AUTO_INCREMENT,
    NAME_APP VARCHAR(50) NOT NULL,
    DESC_APP VARCHAR(500),
    DOC_APP VARCHAR(500),
    COM_APP VARCHAR(500),
    CODE_APP VARCHAR(500),
    DATE_APP VARCHAR(50),
    IP_REQ_APP VARCHAR(50),
    PRIMARY KEY (ID_APP),
    UNIQUE KEY (NAME_APP)
    ); 
     
    CREATE TABLE RPA (
    ID_RPA INT NOT NULL AUTO_INCREMENT,
    NAME_RPA VARCHAR(50) NOT NULL,
    COM_RPA VARCHAR(500),
    DATE_RPA VARCHAR(50),
    IP_REQ_RPA VARCHAR(50),
    PRIMARY KEY (ID_RPA),
    UNIQUE KEY (NAME_RPA)
    ); 
     
    CREATE TABLE ENV (
    ID_ENV INT NOT NULL AUTO_INCREMENT,
    NAME_ENV VARCHAR(50) NOT NULL,
    DESC_ENV VARCHAR(500),
    COM_ENV VARCHAR(500),
    DATE_ENV VARCHAR(50),
    IP_REQ_ENV VARCHAR(50),
    PRIMARY KEY (ID_ENV),
    UNIQUE KEY (NAME_ENV)
    ); 
     
    CREATE TABLE HOST (
    ID_APP INT NOT NULL,
    ID_ENV INT NOT NULL,
    ID_SERVER INT NOT NULL,
    FOREIGN KEY (ID_APP) REFERENCES APPLICATION(ID_APP),
    FOREIGN KEY (ID_ENV) REFERENCES ENV(ID_ENV),
    FOREIGN KEY (ID_SERVER) REFERENCES SERVER(ID_SERVER),
    PRIMARY KEY (ID_APP, ID_ENV, ID_SERVER)
    ); 
     
    CREATE TABLE RESPONSIBLE (
    ID_APP INT NOT NULL,
    ID_RPA INT NOT NULL,
    FOREIGN KEY (ID_APP) REFERENCES APPLICATION(ID_APP),
    FOREIGN KEY (ID_RPA) REFERENCES RPA(ID_RPA),
    PRIMARY KEY (ID_APP, ID_RPA)
    );
    Je voudrais creer une requete qui me permet de lister toutes mes applications
    et de sortir pour un serveur donné (ex : SRVTEST1) si l'application est installée sur celui-ci.

    Ex : SRVTEST1, je veux savoir quelle application est installée dessus :

    Si elle est installée dessus j'affich ele nom du server dans une colonne sinon j'affiche NULL.


    Pour cela je fais ca et ca marche nickel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
    APPLICATION.NAME_APP,APPLICATION.ID_APP,T1.NAME_SERVER
    FROM
    APPLICATION
    left join
    (SELECT  SERVER.NAME_SERVER , HOST.ID_APP FROM HOST,SERVER 
    WHERE  HOST.ID_SERVER=SERVER.ID_SERVER
    AND SERVER.NAME_SERVER ='SRVTEST1') AS T1
    on
    APPLICATION.ID_APP = T1.ID_APP;
    Ce qui donne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +----------+--------+-------------+
    | NAME_APP | ID_APP | NAME_SERVER |
    +----------+--------+-------------+
    | APPTEST1 |      1 | SRVTEST1    |
    | APPTEST2 |      2 | NULL        |
    | APPTEST3 |      3 | NULL        |
    +----------+--------+-------------+
    3 rows in set (0.00 sec)
    maintenant à coté de la colonne NAME_SERVER je voudrais afficher l'envirronnement du serveur est question mais je ne sais pas comment faire.

    Ce qui donnerai ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +----------+--------+-------------+-------------+
    | NAME_APP | ID_APP | NAME_SERVER | NAME_ENV |
    +----------+--------+-------------+-------------+
    | APPTEST1 |      1 | SRVTEST1    | PROD    |
    | APPTEST2 |      2 | NULL        |
    | APPTEST3 |      3 | NULL        |
    +----------+--------+-------------+
    Avez vous une idée svp, sachant que j'ai une table qui stocke toutes ces infos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TABLE HOST
    ID_APP ID_ENV ID_SERVER 
    1 1 1 
    1 2 3 
    2 2 2
    Merci d'avance .....

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    La première requête est perfectible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a.NAME_APP, a.ID_APP,
    	s.NAME_SERVER
    FROM APPLICATION a
    LEFT OUTER JOIN HOST h ON h.ID_APP = a.ID_APP
    	LEFT OUTER JOIN SERVER s
    		ON s.ID_SERVER = h.ID_SERVER
    		AND s.NAME_SERVER = 'SRVTEST1'
    Et pour ajouter l'environnement, il suffit d'ajouter une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT a.NAME_APP, a.ID_APP,
    	s.NAME_SERVER,
    	e.NAME_ENV
    FROM APPLICATION a
    LEFT OUTER JOIN HOST h ON h.ID_APP = a.ID_APP
    	LEFT OUTER JOIN SERVER s
    		ON s.ID_SERVER = h.ID_SERVER
    		AND s.NAME_SERVER = 'SRVTEST1'
    	LEFT OUTER JOIN ENV e ON e.ID_ENV = h.ID_ENV

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    effectivement ca fonctionn etrès bien .....

    Merci beaucoup pour ta réponse rapide .....

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    bon en fait ca ne fonctionne pas comme je souhaiterai ....

    Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT a.NAME_APP, a.ID_APP, s.NAME_SERVER, e.NAME_ENV
    FROM APPLICATION a
    LEFT OUTER JOIN HOST h ON h.ID_APP = a.ID_APP
    LEFT OUTER JOIN SERVER s
    ON s.ID_SERVER = h.ID_SERVER
    AND s.NAME_SERVER = 'SRVTEST01'
    LEFT OUTER JOIN ENV e ON e.ID_ENV = h.ID_ENV;
    Ca m'affiche :

    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
     
     
    +------------+--------+-------------+------------+
    | NAME_APP   | ID_APP | NAME_SERVER | NAME_ENV   |
    +------------+--------+-------------+------------+
    | MOTORTRADE |      1 | NULL        | PRODUCTION |
    | MOTORTRADE |      1 | NULL        | PRODUCTION |
    | NAVISION   |      2 | NULL        | PRODUCTION |
    | NAVISION   |      2 | SRVTEST01   | PRODUCTION |
    | CODA       |      3 | NULL        | PRODUCTION |
    | CNI        |      4 | NULL        | PRODUCTION |
    | CNI        |      4 | NULL        | PRODUCTION |
    | CNI        |      4 | NULL        | PRODUCTION |
    | CASSIOPAE  |      5 | NULL        | PRODUCTION |
    | CASSIOPAE  |      5 | NULL        | PRODUCTION |
    | REFCATWEB  |      6 | NULL        | RECETTE    |
    | SAP VO     |      7 | NULL        | PRODUCTION |
    +------------+--------+-------------+------------+
    Comme tu peux le constater ca m'affiche PRODUCTION dans toute la colonne NAME_ENV

    Je voudrais que ca affiche NULL et que seul le serveur qui m'interesse s'affiche :

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    > | NAVISION   |      2 | SRVTEST01   | PRODUCTION |

    Merci d'avance et désolé d'abuser de ta bonne volonté ....

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    On peut ajouter un CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT a.NAME_APP, a.ID_APP,
    	s.NAME_SERVER,
    	CASE
    		WHEN s.NAME_SERVER IS NULL THEN NULL
    		ELSE e.NAME_ENV
    	END AS NAME_ENV
    FROM APPLICATION a
    LEFT OUTER JOIN HOST h ON h.ID_APP = a.ID_APP
    	LEFT OUTER JOIN SERVER s
    		ON s.ID_SERVER = h.ID_SERVER
    		AND s.NAME_SERVER = 'SRVTEST1'
    	LEFT OUTER JOIN ENV e ON e.ID_ENV = h.ID_ENV

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Points : 132
    Points
    132
    Par défaut
    c'est parfait !!!! c'est le résultat attendu. merci CinePhil !!!!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/11/2010, 13h46
  2. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27
  3. jointure avec clé composée de 2 colonnes
    Par free07 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/10/2005, 07h07
  4. Réponses: 2
    Dernier message: 27/10/2005, 11h15
  5. Update dans SYBASE avec jointure sur 2 colonnes
    Par metheorn dans le forum Sybase
    Réponses: 2
    Dernier message: 24/06/2005, 16h51

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