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 entre deux champs d'une même table


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Jointure entre deux champs d'une même table
    Salutations.
    Je coince depuis plusieurs semaines sur une base de données représentant le cablage d'une entreprise.

    Voici un morceau du modele relationnel tel que je l'ai conçu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    port_switche_1(IDport_switche_1, IDswitche_1)
    port_switche(Idport_switche, IDswitche)
    type_cable(IDtype_cable, nomtype_cable)
    prise(IDprise)
    relier(#IDport_switche_1, #IDport_switche, #IDtype_cable, #IDprise)
    Pour vous aider à comprendre :
    Une prise est reliée au port d'un switche via un cable.
    Des switches peuvent être reliés entre eux via un cable.


    Mes requêtes ne marchent pas quand je demande par exemple de montrer la relation entre la prise 1 et la prise 2.

    Sachant que
    -la prise 1 est reliée au port 1 du switche 1 via un cable UTP
    -la prise 2 est reliée au port 1 du switche 2 via un cable UTP
    -le port 2 du switche 1 est relié au port 2 du switche 2 via un cable en fibre optique,

    La requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT prise.IDprise, type_cable.IDtype_cable, port_switche.IDport_switche, port_switche_1.IDport_switche_1
     
    FROM prise, port_switche, port_switche_1, type_cable, relier
     
    WHERE prise.IDprise = relier.IDprise
    AND port_switche.IDport_switche = relier.IDport_switche
    AND port_switche_1.IDport_switche_1 = relier.IDport_switche_1
    AND type_cable.IDtype_cable = relier.IDtype_cable
    AND prise.IDprise LIKE 'prise1', 'prise2'
    devrait me donner un résultat du genre

    IDprise....||....type_cable....||....IDport_switche.....||....IDport_switche_1
    prise 1....||..........UTP........||......switche1_p01.....||..........................
    prise 2....||..........UTP........||......switche2_P01.....||..........................
    .............||...........FO.........||......switche1_p02.....||...switche2_p02....
    .............||...........FO.........||......switche2_p02.....||...switche1_p02....
    mais non... Il ne trouve aucun résultat.

    J'ai du oublier quelque chose, mais je ne sais pas quoi.

    Si quelqu'un a une idée... Je serai ravi de la lire, car là je suis à cours d'idées.

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    ton idprise vaut exactement prise1 ou prise2?
    dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT prise.IDprise, type_cable.IDtype_cable, port_switche.IDport_switche, port_switche_1.IDport_switche_1
    FROM prise, port_switche, port_switche_1, type_cable, relier
    WHERE prise.IDprise = relier.IDprise
    AND port_switche.IDport_switche = relier.IDport_switche
    AND port_switche_1.IDport_switche_1 = relier.IDport_switche_1
    AND type_cable.IDtype_cable = relier.IDtype_cable
    AND prise.IDprise  in ('prise1', 'prise2')
    sinon revois la syntaxe du like

    A+

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Avec des jointures internes, ça ne peut effectivement pas marcher. Regarde bien le résultat que tu attends :
    Dprise....||....type_cable....||....IDport_switche.....||....IDport_switche_1
    prise 1....||..........UTP........||......switche1_p01.....||........NULL.........
    prise 2....||..........UTP........||......switche2_P01.....||........NULL.........
    ...NULL...||...........FO.........||......switche1_p02.....||...switche2_p02....
    ...NULL...||...........FO.........||......switche2_p02.....||...switche1_p02....
    Tu as des NULL sur chaque ligne, parce qu'il n'y a pas de correspondances entre les tables. Donc les jointures ne vont rien ramener.
    Pour faire une telle requête, il faut partir de la donnée qui est sur toutes les lignes, c'est-à-dire IDport_switche. Ensuite, on fait des jointures externes sur les autres tables.
    Ca devrait donner quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT prise.IDprise, type_cable.IDtype_cable, port_switche.IDport_switche, port_switche_1.IDport_switche_1
    FROM prise
        RIGHT JOIN relier on prise.IDprise = relier.IDprise
        RIGHT JOIN type_cable on relier.IDtype_cable = type_cable.IDtype_cable 
        LEFT JOIN port_switche on relier.IDport_switche = port_switche.IDport_switche
        LEFT JOIN port_switche_1 on relier.IDport_switche_1 = port_switche_1.IDport_switche_1
    WHERE prise.IDprise  IN ('prise1', 'prise2')
    Je n'ai pas du tout testé, donc je ne te garantis pas que la requête soit bonne, mais c'est l'idée : passer par les jointures externes...
    J'avoue, dans le résultat attendu, ne pas comprendre la seconde ligne de fibre optique .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui Cybher tu as raison, j'ai fait une faute en recopiant la requête. C'est bien IN qu'il faut que je mette, et non pas LIKE. Et pour répondre à ta question, non dans la colonne IDprise j'ai beaucoup de lignes.

    Ced, Pour les jointures externes...

    j'ai compris le fonctionnement, mais la requête n'affiche pas ce que je veux. elle me donne :

    IDprise....||....IDtype_cable....||....IDport_switche.....||....IDport_switche_1
    prise 1....||..........T1............||......switche1_p01.....||........NULL.........
    prise 2....||..........T1............||..........NULL.............||........NULL.........
    J'ai l'impression de chercher midi à 14 h ou de me compliquer la vie... Ou bien le problème vient-il du MCD en lui même.
    J'ai créé la table port_switche_1 qui est identique à port_switche pour pouvoir mettre en relation différents champs d'une même colonne, tout en prenant compte une table tierce (ici la table type_cable).
    Peut être fallait il seulement faire une auto-jointure dans la table port_switche en mettant par exemple une clé étrangère port_switche_1 en fin de la table port_switche ?

    Je m'arrache les cheveux, je vais finir par admettre que la relation par cable entre différents switches n'est pas modélisable...

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par oubli Voir le message
    J'ai créé la table port_switche_1 qui est identique à port_switche pour pouvoir mettre en relation différents champs d'une même colonne, tout en prenant compte une table tierce (ici la table type_cable).
    Peut être fallait il seulement faire une auto-jointure dans la table port_switche en mettant par exemple une clé étrangère port_switche_1 en fin de la table port_switche ?

    C'est là que je ne comprends pas bien. Deux ports de deux switchs différents peuvent être reliés entre eux par un cable, ça OK .
    Donc, comme la table port_switche a bien le switch dans ses champs, et une ligne par port pour chaque switch, il est possible de faire une jointure de port_switche sur port_switche (du switch 1 vers le switch 2) via la table relier, avec un cable en fibre optique (type du cable dans relier).
    Il n'y a pas forcément besoin de dédoubler port_switche, non ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je suis tout à fait d'accord avec toi Ced mais dans l'association relier je dois avoir une clé étrangère #IDport_switche_1 ou quelque chose du genre, pour renseigner la base de données en lui disant que tel port est relié à tel autre par un cable en Fibre Optique.

    C'est pour cela que j'ai finalement créé la table clone port_switche_1...

    Car je n'arrive pas à imaginer comment le langage sql pourrait comprendre que dans la table relier l'identifiant switche1_P02 du champ IDport_switche est égal à l'identifiant switche_1_P02 du champ IDport_switche_1 sans que je dise dans la requete sql quelque chose du genre
    ...
    where port_switche.IDport_switche = relier.IDport_switche_1
    and port_switche.IDport_switche = relier.IDport_switche
    ...
    Si tu peux éclairer ma lanterne, j'aimerais vraiment comprendre le schmilblic.
    Merci d'ailleurs pour les explications passées et à venir

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    En faisant un renommage de la dite table, cela donnerait quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT prise.IDprise, type_cable.IDtype_cable, ps1.IDport_switche as IDport_switche_1, ps2.IDport_switche as IDport_switche_2
    FROM prise
        RIGHT JOIN relier ON prise.IDprise = relier.IDprise
        RIGHT JOIN type_cable ON relier.IDtype_cable = type_cable.IDtype_cable 
        LEFT JOIN port_switche ps1 ON relier.IDport_switche = ps1.IDport_switche
        LEFT JOIN port_switche ps2 ON relier.IDport_switche_1 = ps2.IDport_switche
    WHERE prise.IDprise  IN ('prise1', 'prise2')
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par kangaxx Voir le message
    En faisant un renommage de la dite table, cela donnerait quelque chose comme cela :
    [...]
    J'ai essayé ta solution, Kangaxx la liche, mais apparemment le fait d'utiliser des alias ne change pas le résultat, qui est le même qu'avec la requête de Ced.

    J'ai pourtant bien vérifié les données dans mes tables, les informations que je veux sont bien renseignées, enfin à mes yeux...

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Enfin une personne cultivée sur ce forum.. (bon ok juste un amateur de D&D :p)

    Oui oui, cet exemple était juste la pour montrer qu'il n'était pas nécessaire de dédoubler la table, qu'on pouvait obtenir le même résultat avec une seule table.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

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

Discussions similaires

  1. regrouper deux champs d'une même table
    Par marcus crassus dans le forum Access
    Réponses: 1
    Dernier message: 10/09/2014, 13h58
  2. Réponses: 3
    Dernier message: 16/07/2013, 15h02
  3. [OpenOffice][Base de données] Générer une clé a partir de deux champs d'une même table
    Par fasfas dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 01/03/2010, 10h33
  4. Grouper deux champs d'une même table
    Par Bridou dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/04/2009, 10h18
  5. [MySQL] Jointure: Avec deux champs d'une même table
    Par Vinuto dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/11/2008, 20h10

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