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 :

Double jointure sur une meme table


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Par défaut Double jointure sur une meme table
    Bonjour à tous.
    J'ai une table où j'enregistre des membres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tblmembres (id_membres, pseudo, nom)
    Dans l'objectif de pouvoir mettre les membres en relation (un membre peu avoir un autre comme amis, ou sur sa liste noire), j'ai créer une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tblrelations(id_relation, id_membre1, id_membre2, type_relation)
    Je veux écrire un sql qui affichent les amis du membre dont l'ID est 50.
    J'ecris le SQl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM tblrelations WHERE 
     id_membre1='50' OR id_membre2='50' 
    AND type_relation='1'
    Le problème est que cette requete renvoi les identifiants alors que moi je veux les pseudos des membres. Mais je ne vois pas bien comment avec un INNER JOIN recuperer les pseudos correspondants aux 2 colonnes id_membre1 et id_membre2.

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Pour avoir tous les amis dans une seule colonne, il faut faire une union de deux fois presque la même requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT m1.pseudo AS ami
    FROM tblmembres m1
    INNER JOIN tblrelations r1 ON r1.id_membre1 = m1.id
    WHERE r1.type_relation = 1
      AND r1.id_membre2 = 50
     
    UNION
     
    SELECT m2.pseudo AS ami
    FROM tblmembres m2
    INNER JOIN tblrelations r2 ON r2.id_membre2 = m2.id
    WHERE r2.type_relation = 1
      AND r2.id_membre1 = 50
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut autre solution avec une seule jointure pour tout
    Bonjour,
    Une autre solution avec une seule requête et jointure :
    On part de l'hypothèse qu'il y a réciprocité, si l'un est ami avec l'autre, l'autre est ami avec l'un.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT t2.id_membres, t2.nom
    -- on filtre les éléments uniques car membre1 peut être ami de membre2 et vice versa
    FROM tblrelations t1
    INNER JOIN tblmembres t2 ON ( t1.id_membre1 =50 OR t1.id_membre2 =50 )
    AND t1.type_relation =1
    -- on filtre ici au lieu du where pour limiter les résultats dans la jointure
    AND (t2.id_membres = t1.id_membre1 OR t2.id_membres = t1.id_membre2)
    -- on crée le lien entre les deux tables
    AND t2.id_membres <>50
    -- on enlève le membre sur lequel on fait la recherche
    Normalement je n'ai pas du me tromper, à tester sur un jeu de résultat.
    Bon courage

  4. #4
    Membre éclairé Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Par défaut
    Merci beaucoup à CinePhil et patic pour les solutions qu'ils m'ont chacun proposé.
    Malheureusement, avec la solution de CinePhil , je recois le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unable to parse query: "UNION" is not supported.
    Personnellement j'ai pensé que c'est lié au fait que mes tables sont de type INNODB. Finalement j'ai adopté la solution de patic .

    Mais à tous

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Union est très bien supporté par le moteur InnoDB !
    Quelle est ta version de MySQL ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre éclairé Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Par défaut
    J'ai la version 5.1.54 de mysql

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

Discussions similaires

  1. Double jointure sur une même table
    Par yosaaa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2015, 12h02
  2. double jointure sur la meme table
    Par erox44 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2008, 17h28
  3. 2 jointures sur une meme table
    Par amamildor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/10/2007, 17h24
  4. [MySQL] Plusieurs jointures sur une même table
    Par stephyyr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 14h24
  5. DOUBLE REQUETE SUR UNE MEME TABLE
    Par MORAS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/01/2006, 13h40

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