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 :

Jointure sur requêtes multiples


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut Jointure sur requêtes multiples
    Bonjour,

    voici le contexte de ma requête :

    j'ai une table qui contient les animaux possédés par un utilisateur.
    J'ai besoin de connaitre les animaux où il y a au moins 1 mâle et 1 femelle (champ "genre" de ma BDD).

    Or aujourd'hui je fais ça en plusieurs sous requêtes (avec php), ce qui est assez lourd car beaucoup d'animaux sont présents dans la base.
    Voici un exemple littéral de ce que je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Selectionne tous les animaux qui appartiennent à X et qui sont des mâles
    {
       vérifie s'il y a également une femelle qui appartient à X pour cet animal
       {
           si oui alors ...
       }
    }
    J'essaye en vain d'afficher en une requête mais je galère et je me demande si c'est possible à faire.

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Et comment fait-on pour deviner la structure de vos tables ?

    Postez donc vos requêtes actuelle et une description brève de la structure des tables associées

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut
    la structure n'a rien de compliquée
    id (int 11)
    membre (smallint 5)
    animal (tinyint 3)
    genre (enum '0','1')

    voici mes requetes et mon code, de manière simplifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "SELECT animal FROM zoo_possession WHERE membre='1' AND genre='1'"
    while(...)
    {
       "SELECT animal FROM zoo_possession WHERE membre='1' AND genre='2' AND animal='".$o->animal."'
       if(...)
       {
          mes actions...
       }
    }
    merci d'avance

  4. #4
    Membre confirmé
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Points : 542
    Points
    542
    Par défaut
    On va peut être proposer une meilleure solution , mais je pense qu'avec la clause EXISTS on pourrait s'en sortir...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT po.animal FROM zoo_possession po
    WHERE po.membre='1' AND po.genre='1'
    AND EXISTS (SELECT 1 FROM zoo_possession WHERE membre = po.membre AND animal = po.animal AND genre = '2')

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut
    je ne suis pas très familier de EXISTS
    Ca fonctionne merci beaucoup !

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Avec une simple auto-jointure, ça marche aussi.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT pm.animal 
    FROM zoo_possession pm
    inner join zoo_possession pf on pf.membre = pm.membre and pf.animal = pm.animal and pf.genre = 2
    WHERE po.membre=1
    AND po.genre=1
    La requête sera plus rapide, et plus facile à optimiser pour le SGBD.

    Eventuellement, s'il y a plusieurs femelles tu auras besoin de faire un DISTINCT :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT distinct pm.animal 
    FROM zoo_possession pm
    inner join zoo_possession pf on pf.membre = pm.membre and pf.animal = pm.animal and pf.genre = 2
    WHERE po.membre=1
    AND po.genre=1
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Stringbuilder, tu as un alias "po" qui n'est pas employé pour les tables de la requête et si tu fais pf.animal = pm.animal tu fais en fait une jointure de chaque animal avec lui-même. Difficile alors qu'il soit mâle et femelle !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 869
    Points
    12 869
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    ..et si tu fais [codeinline=SQL]pf.animal = pm.animal[/code] tu fais en fait une jointure de chaque animal avec lui-même. Difficile alors qu'il soit mâle et femelle !
    C'est pourtant ce que demande cedrick21, enfin d'après ce que je comprends de son code:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    "SELECT animal FROM zoo_possession WHERE membre='1' AND genre='1'"
    while(...)
    {
       "SELECT animal FROM zoo_possession WHERE membre='1' AND genre='2' AND animal='".$o->animal."'
       if(...)
       {
          mes actions...
       }
    }

    Sinon la requête de StringBuilder est rapide à corriger:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT pm.animal 
    FROM zoo_possession pm
    INNER JOIN zoo_possession pf ON pf.membre = pm.membre AND pf.animal = pm.animal AND pf.genre = '2'
    WHERE pm.membre='1'
    AND pm.genre='1'

    Tatayo.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Je me suis posé la même question et je suis parvenu à la conclusion que par "animal" on entend l'espèce de l'animal, mais pas l'individu.

    Sinon il s'agit d'une division relationnelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SELECT animal 
        FROM zoo_possession
       WHERE membre = 1
    GROUP BY animal 
      HAVING count(distinct genre) = 2;

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Stringbuilder, tu as un alias "po" qui n'est pas employé pour les tables de la requête et si tu fais pf.animal = pm.animal tu fais en fait une jointure de chaque animal avec lui-même. Difficile alors qu'il soit mâle et femelle !
    Non, il faut juste remplacer "po" par "pm", copier/collé pas fini de modifier.

    ID est l'identifiant.
    animal est, j'imagine, le "type" d'animal (chien, chat, etc.) ça n'est pas l'animal physique.
    On ne jouit bien que de ce qu’on partage.

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

Discussions similaires

  1. [AC-2007] faire une jointure sur requête
    Par lolocdm dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/02/2015, 14h54
  2. [DATA] Jointure sur identifiant multiple
    Par Tyler Durden dans le forum SAS Base
    Réponses: 2
    Dernier message: 02/10/2009, 20h15
  3. [MySQL] requête avec jointure sur la même table
    Par gwena54 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/05/2007, 11h22
  4. jointure sur champ avec multiple valeur
    Par robert_trudel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/05/2007, 17h40
  5. [ODBC] Pb de requète avec jointure sur 2 bases
    Par Invité dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/12/2006, 16h46

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