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 :

requete entre trois tables


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut requete entre trois tables
    Bonjour,

    Je seche sur la mise en place de la requete entre trois tables user, journal, abonnement (abonnement faisant la jointure entre les deux autres)

    table user
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE `user` (
      `id` tinyint(4) NOT NULL auto_increment,
      `name` varchar(6) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM AUTO_INCREMENT=6 ;
     
    INSERT INTO `user` (`id`, `name`) VALUES (1, 'alain');
    INSERT INTO `user` (`id`, `name`) VALUES (2, 'bruno');
    INSERT INTO `user` (`id`, `name`) VALUES (3, 'claude');
    INSERT INTO `user` (`id`, `name`) VALUES (4, 'daniel');
    INSERT INTO `user` (`id`, `name`) VALUES (5, 'eric');
    table journal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE `journal` (
      `jid` tinyint(4) NOT NULL default '0',
      `jname` varchar(6) NOT NULL default '',
      PRIMARY KEY  (`jid`)
    ) TYPE=MyISAM;
     
    INSERT INTO `journal` (`jid`, `jname`) VALUES (1, 'monde');
    INSERT INTO `journal` (`jid`, `jname`) VALUES (2, 'libe');
    INSERT INTO `journal` (`jid`, `jname`) VALUES (3, 'figaro');
    Table abonnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE `abonnement` (
      `id` tinyint(4) NOT NULL default '0',
      `jid` tinyint(4) NOT NULL default '0'
    ) TYPE=MyISAM;
     
    INSERT INTO `abonnement` (`id`, `jid`) VALUES (1, 1);
    INSERT INTO `abonnement` (`id`, `jid`) VALUES (1, 2);
    INSERT INTO `abonnement` (`id`, `jid`) VALUES (2, 1);
    INSERT INTO `abonnement` (`id`, `jid`) VALUES (4, 3);
    INSERT INTO `abonnement` (`id`, `jid`) VALUES (5, 1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    La requête suivante donne la liste des abonnements :
    select u.name, j.jname
    from user AS u 
    inner join abonnement AS a on u.id = a.id
    inner join journal AS j on a.jid = j.jid
     
    name  | jname
    ---------------
    alain 	| monde
    bruno |	monde
    eric 	 | monde
    alain 	| libe
    daniel 	| figaro
    Maintenant comment faire pour obtenir la liste des user qui ne sont pas abonnés au monde j'ai essayé en rajoutant "where j.jid <> 1" mais le résultant n'est pas celui souhaité

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select u.name, j.jname
    from user AS u 
    inner join abonnement AS a on u.id = a.id
    inner join journal AS j on a.jid = j.jid
    where j.jid <> 1
     
    name  | jname
    --------------------
    alain 	 | libe
    daniel 	| figaro
    Car d'une part alain est abonné au monde et je voudrais vois aussi dans la liste claude qui n'est abonné à rien.

    Bref voici le résultat que je souhaite avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    name  | jname
    --------------------
    claude 	| NULL
    daniel 	| figaro
    Qqs précisions:
    Mon SGBD : MySQL 4.0.17
    En une seule requête


    Merci pour votre aide

  2. #2
    Membre habitué Avatar de nantais
    Inscrit en
    Juillet 2004
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 158
    Points : 192
    Points
    192
    Par défaut
    Je ne vois pas comment tu peux le faire en une seule requête, sans utiliser de requêtes imbriquées, ce que la version de ton SGBD interdit....

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Merci pour la réponse ...

    Même si j'avais cru cela posible en une seule requête : ben tant pis je vais en faire deux !

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 125
    Points
    125
    Par défaut
    En utilisant plutot un left join ça ne marcherait pas ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    C'est un peu mieux avec ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT u.name, j.jname
    FROM user AS u
    LEFT  JOIN abonnement AS a ON u.id = a.id
    LEFT  JOIN journal AS j ON a.jid = j.jid
    WHERE  ( j.jid <> 1 or j.jid is null)
    AND u.id <> 1

    Seul soucis est que "u.id <> 1" je ne sais pas comment trouver la liste des valeurs (ici 1 ) je pensais que via une autojointure ....

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 7
    Points : 8
    Points
    8
    Par défaut ze reponse is
    re-bonojour


    select ouf.id,name

    from
    (
    select id from user where id not in (select id from abonnement)
    union
    select id from abonnement where id not in (select id from abonnement where jid=1)
    ) as ouf
    join
    user on user.id=ouf.id

    on aura : claude et daniel

    Bono,

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    re-bonojour

    comme my sql ne permet pa les sous requete ie: (la table ouf)
    ton modele n'est helas pas valide pour la requete souhaiter, fo revoir la conception
    pour parer à l'urgence si y en a fo creer la table ouf dans my sql et faire une jointure simple avec


    Bono

  8. #8
    Membre habitué Avatar de nantais
    Inscrit en
    Juillet 2004
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 158
    Points : 192
    Points
    192
    Par défaut
    Ce qu'il te faudra faire, au final c'est :

    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
     
    CREATE TABLE temp AS (
    select u.id
    from user AS u
    inner join abonnement AS a on u.id = a.id
    inner join journal AS j on a.jid = j.jid
    where j.jid = 1)
     
    SELECT u.name, j.jname
    FROM user AS u
    INNER JOIN abonnement AS a on u.id = a.id
    INNER JOIN journal AS j on a.jid = j.jid
    LEFT JOIN temp ON u.id=temp.id
    WHERE temp.id IS NULL
     
    DROP TABLE temp

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Merci pour vos réponses . Je considère que c'est résolu en utillisant les requêtes ci-apres :


    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
    CREATE TABLE temp AS (
    select u.id
    from user AS u
    inner join abonnement AS a on u.id = a.id
    left join journal AS j on a.jid = j.jid
    where j.jid = 1)
     
    SELECT u.name, j.jname
    FROM user AS u
    LEFT JOIN abonnement AS a on u.id = a.id
    LEFT JOIN journal AS j on a.jid = j.jid
    LEFT JOIN temp ON u.id=temp.id
    WHERE temp.id IS NULL
     
    DROP TABLE temp

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

Discussions similaires

  1. Requete entre 2 table et récupération d'une ligne
    Par lechevin dans le forum Langage SQL
    Réponses: 13
    Dernier message: 12/01/2006, 13h54
  2. requete entre deux tables
    Par drakov666 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/11/2005, 11h51
  3. [Débutant] requete entre plusieurs tables
    Par xufux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 14h00
  4. [debutant]problematique entre trois tables
    Par djodjo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/08/2005, 15h21
  5. Requete entre 2 tables.
    Par stebar dans le forum Débuter
    Réponses: 11
    Dernier message: 09/06/2004, 16h21

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