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

Langage SQL Discussion :

SELECT sur relation réflexive


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut SELECT sur relation réflexive
    Bonsoir à toutes et à tous,

    j'essaye désespérément d'établir une "simple" requête sur une base test pour tester une relation réflexive.
    Voici ma base test (constituée de 2 tables t_personne et t_relation) :
    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
     
    DROP TABLE IF EXISTS `t_relation`;
    DROP TABLE IF EXISTS `t_personne`;
     
    -- -------------------------------------------
    -- T_PERSONNE
    -- -------------------------------------------
    CREATE TABLE `t_personne` (
      `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `civilite` ENUM("","Mr","Mme","Mlle") NOT NULL,
      `nom` VARCHAR(255) NOT NULL,
      PRIMARY KEY  (`id`),
      KEY (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `t_personne` (`id`, `civilite`, `nom`) VALUES
    (1, "Mr", "AA"),
    (2, "Mr", "BB"),
    (3, "Mme", "CC"),
    (4, "Mme", "DD"),
    (5, "", "EE"),
    (6, "Mr", "FF");
     
     
    -- -------------------------------------------
    -- T_RELATION
    -- -------------------------------------------
    CREATE TABLE `t_relation` (
      `id_personne_1` SMALLINT(5) UNSIGNED NOT NULL,
      `id_personne_2` SMALLINT(5) UNSIGNED NOT NULL,
      PRIMARY KEY  (`id_personne_1`, `id_personne_2`),
      FOREIGN KEY (`id_personne_1`) REFERENCES `t_personne` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`id_personne_2`) REFERENCES `t_personne` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `t_relation` (`id_personne_1`, `id_personne_2`) VALUES
    (1, 4), -- AA et DD sont en relation
    (2, 1), -- BB et AA sont en relation
    (3, 6), -- CC et FF sont en relation
    (6, 4), -- FF et DD sont en relation
    (6, 2); -- FF et BB sont en relation
    Comme vous l'auriez compris, j'ai mis en relation réflexive l'entité PERSONNE.
    Le jeu d'essai de la base test indique donc ceci :
    - AA est en relation avec BB et DD
    - BB est en relation avec AA et FF
    - CC est en relation avec FF
    - DD est en relation avec AA et FF
    - EE n'a pas de relation
    - FF est en relation avec BB, CC et DD

    Le but de ma requête SELECT serait de me retourner les personnes en relation avec une personne précise.
    Genre, je souhaite connaître les personnes (si il y en a) en relation avec la personne d'identifiant 4 (Mme DD). La requête devant me retourner AA et FF.

    Voici ma requête actuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT nom
    FROM t_personne P
        INNER JOIN t_relation R1 ON R1.id_personne_1 = P.id
        INNER JOIN t_relation R2 ON R2.id_personne_2 = P.id
    WHERE
        R1.id_personne_1 = 4 OR
        R2.id_personne_2 = 4
    qui bien sûr ne fonctionne pas.

    Quelqu'un aurait-il l'amabilité de m'aider ?
    Merci

    @ bientôt

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut,

    Si en entrée tu as le nom, tu es obligé d'attaquer 2 fois la table personne (ça marche aussi pour les id)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p2.nom
    FROM t_personne P1
    join t_relation r on (p1.id=r.id_personne_1 or p1.id=r.id_personne_2)
    join t_personne p2 on (r.id_personne_1=p2.id or r.id_personne_2=p2.id)
    where p1.nom='DD'
    and p2.nom!='DD'
    Mais si tu passes par les id, tu peux éviter une passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.nom
    FROM t_personne p
    where exists (select 1 from t_relation r
                 where (r.id_personne_1=p.id or r.id_personne_2=p.id)
                 and (r.id_personne_1=4 or r.id_personne_2=4))
    and p.id!=4

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Par défaut
    TROP DE LA BALLE !!!


    merci skuatamad

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

Discussions similaires

  1. SELECT avec une relation réflexive
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/06/2014, 09h31
  2. [MLD] Relation réflexive sur une table
    Par Steph0 dans le forum Schéma
    Réponses: 5
    Dernier message: 27/06/2012, 14h43
  3. select sur une relation n:n
    Par zoulou123 dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/08/2011, 03h45
  4. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54

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