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 :

Requête sur une table de jointure


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 80
    Par défaut Requête sur une table de jointure
    Bonjour,

    J'ai une table des sociétés :
    id_soc lib_soc
    01 soc1
    02 soc2
    03 soc3

    et une table des dirigeants
    id_dir nom_dir
    d1 dupont
    d2 durand
    d3 dupuis

    et enfin une table de jointure (ste_has_dir)
    id_soc id_dir
    01 d1
    01 d3
    02 d1
    02 d3
    03 d1
    03 d2
    03 d3



    je voudrais savoir comment effectuer une requête me retournant la liste des sociétés qui ont comme dirigeant d1 ET d3

    Est-ce faisable en une seule requête ?

    Merci d'avance de votre réponse.

    Cordialement.

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Citation Envoyé par MistyMan Voir le message
    et une table des dirigeants
    id_dir nom_dir
    d1 dupont
    d2 durand
    d3 dupuis
    Tout d'abord tu devrais changer le type de id_dir pour les raiosns exposées dans ce post :
    http://www.developpez.net/forums/d720715/bases-donnees/mysql/debuter/creation-tables-foreign-key/
    Citation Envoyé par MistyMan Voir le message
    je voudrais savoir comment effectuer une requête me retournant la liste des sociétés qui ont comme dirigeant d1 ET d3
    Est-ce faisable en une seule requête ?
    Bien sûr, justement en mettant les tables en jointure.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT 
    s.id_soc, s.lib_soc
    from sociétés s.soc
    inner join ste_has_dir shd1 ON shd1.id_soc=s.id_soc
    AND shd1.id_dir ='d1'
    inner join ste_has_dir shd2 ON shd2.id_soc=s.id_soc
    AND shd2.id_dir ='d3'
    Le DISTINCT est là pour éviter que les sociétés apparaissent deux fois, une fois par directeur.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Par défaut
    Juste pour confirmer car j'apprends moi aussi petit à petit à utiliser ce genre de requêtes: Pourrai-t-on faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT 
    s.id_soc, s.lib_soc
    FROM sociétés s.soc
    INNER JOIN ste_has_dir shd1 ON shd1.id_soc=s.id_soc
    AND (shd1.id_dir ='d1' OR shd1.id_dir ='d3')

    C'est à dire selectionne id_soc, lib_soc de la table société (s), jointe à ste_has_dir (sd)
    quand s.id_soc = sd.id_soc (cohérence des données)
    ET que ( sd.id_dir = 'd1' OU 'd3' )

    Ce qui nous donne des doublons car d1 et d3 apparaissent dans chaque société, mais qu'on enlève via le DISTINCT...

    Dans ce cas j'imagine que ça sort le même résultat je me trompe?

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Oui, désolé tu te trompes car là tu obtiendrais les sociétés qui ont d1 OU d3 comme directeurs et non plus d1 ET d3.
    Comme le shd1.id_dir d'une ligne ne peut pas être en même temps égal à d1 ET d3, il faut deux instanciations de la table pour s'assurer de la corrélation des jointures simultanément sur d1 ET d3.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Par défaut
    OK, tu as certainement raison et je te fais confiance.
    Il faudrait que je copie ce tables pour faire les requêtes et mieux comprendre de moi même.

    Ah ça y est, je vois: ma requête retournera aussi les sociétés qui dont seul D1 ou D3 sont les directeurs (aussi les 2 il me semble)?

    Mettons cette table de jointure et la table des sociétés:

    id_soc id_dir id_soc lib_soc

    01 d1 01 soc1
    01 d3 02 soc2
    02 d1 03 soc3
    02 d3 04 soc4
    03 d1 05 soc5
    03 d2
    03 d3
    04 d1
    04 d6
    05 d3


    Avec ma requête, les critères de jointures sont valables pour les lignes 1,2,3,4,5,7,8,10
    Donc le résultat va donner:

    01 soc1 (2 résultats distinguées)
    02 soc2 (idem)
    03 soc3 (idem)
    04 soc4 (1 seul retour)
    05 soc 5 (idem)

    Donc si j'ai bien compris cette requête est fausse car elle retourne aussi les entreprises dans lesquelles d1 ou d3 sont les seuls directeurs...

    OK, si c'est bien ça je saurai à présent éviter cette erreur de logique.
    Désolé pour le monologue j'avais besoin de ça pour comprendre .


    Un apprentit assoiffé de connaissances

    Merci du coup de main

Discussions similaires

  1. Effectuer une requête sur une table.
    Par Premium dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/05/2007, 16h27
  2. Recupérer le résultat d'une requête sur une table Firebird
    Par defluc dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/04/2007, 18h30
  3. Réponses: 5
    Dernier message: 08/01/2007, 21h03
  4. Jointures externes sur une table de jointure
    Par mart1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/10/2006, 01h33
  5. requéte sur une table
    Par iutcien dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/06/2006, 15h42

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