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 :

Requete sur 3 tables.


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Plaisir
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Plaisir

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Points : 9
    Points
    9
    Par défaut Requete sur 3 tables.
    Bonjour à vous tous,

    J'aimerai une aide de votre part concernant une requête MySQL :

    Cette requête fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT titre FROM pdts 
    INNER JOIN pdts_specs ON pdts_specs.id_pdt = pdts.id_pdt 
    INNER JOIN specs ON specs.id_spec = pdts_specs.id_spec 
     
    WHERE pdts_specs.id_spec = '6'
    Pas de soucis, sauf lorsque je veux ajouter un autre "WHERE"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT titre FROM pdts 
    INNER JOIN pdts_specs ON pdts_specs.id_pdt = pdts.id_pdt 
    INNER JOIN specs ON specs.id_spec = pdts_specs.id_spec 
     
    WHERE pdts_specs.id_spec = '6'  AND pdts_specs.id_spec = '11'
    Ici c'est vide... (Ce qui est logique !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT titre FROM pdts 
    INNER JOIN pdts_specs ON pdts_specs.id_pdt = pdts.id_pdt 
    INNER JOIN specs ON specs.id_spec = pdts_specs.id_spec 
     
    WHERE pdts_specs.id_spec = '6'  OR pdts_specs.id_spec = '11'
    Et cela affiche aussi ceux qui n'ont que : '6' et ceux qui n'ont que : '11'...

    Ce que je souhaite faire c'est afficher les produits dont les spécificités (id_spec) sont aussi bien de "couleur : Rouge" et de "Matière : Plastique".

    Mais je ne trouve pas la solution.

    Si vous avez une petite idée.

    Merci grandement.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 338
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Utilisez un where exists

    Si vous voulez '11' et '6' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT titre FROM pdts 
    INNER JOIN pdts_specs MAIN ON pdts_specs.id_pdt = pdts.id_pdt 
    WHERE pdts_specs.id_spec = '6'  
      AND EXISTS
         (SELECT 0 
          FROM pdts_specs SUBQ 
          WHERE SUBQ.id_pdt = MAIN.id_pdt
            AND SUBQ.id_spec = '11')
    Si vous voulez '11' ou '6'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT titre FROM pdts 
    WHERE EXISTS
         (SELECT 0 
          FROM pdts_specs SUBQ 
          WHERE SUBQ.id_pdt = pdts.id_pdt 
            AND SUBQ.id_spec = '11')
       OR EXISTS
         (SELECT 0 
          FROM pdts_specs SUBQ 
          WHERE SUBQ.id_pdt = pdts.id_pdt 
            AND SUBQ.id_spec = '6')
    Vous pouvez aussi utiliser la requete 2 en remplaçant OR par AND dans le 1er cas
    Edit : je viens de me rendre compte que dans votre requete d'origine, la table SPECS ne sert à rien, je l'ai donc enlevée

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Plaisir
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Plaisir

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Points : 9
    Points
    9
    Par défaut
    Bonjour escartefigue,

    Merci de votre réponse.

    Je vais tester cela et reviens pour vous dire...
    Merci

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Plaisir
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Plaisir

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Points : 9
    Points
    9
    Par défaut
    escartefigue,

    Merci de votre aide.

    La deuxième fonctionne comme je le souhaitais, en changeant 'OR' par 'AND'.

    Effectivement la table "SPECS" ne sert pas... Enfin elle me servait juste à récupérer le nom de "id_spec" pour m'éviter de refaire une requête par la suite.

    Mais c'est ce que je vais finir par faire au vu de la complexité de la requête... Car par la suite il va y a voir d'autres critères à additionner ...

    Merci beaucoup de votre aide et temps.

  5. #5
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 687
    Points : 2 014
    Points
    2 014
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT titre 
    FROM pdts 
    INNER JOIN pdts_specs ON pdts_specs.id_pdt = pdts.id_pdt 
    INNER JOIN specs ON specs.id_spec = pdts_specs.id_spec 
     
    WHERE pdts_specs.id_spec IN ('6', '11')
    Ou alors vu que tu ne sélectionnes que le titre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT titre 
    FROM pdts 
    WHERE id_pdt IN (
         SELECT id_pdt FROM  pdts_specs WHERE id_spec IN ('6', '11')
    )
    Il suffit de mettre un IN (donc d'être IN)
    Tes clés primaires sont des numéros sous forme de chaines de caractères ?

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

Discussions similaires

  1. besoin d'aide -> requete sur 2 tables avec count()
    Par parksto dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2005, 19h06
  2. requete sur 2 tables mysql
    Par PAYASS59 dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/09/2005, 11h48
  3. Pb requete sur 2 tables
    Par panini182 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 09/08/2005, 17h26
  4. Requete sur deux tables
    Par ReaseT dans le forum ASP
    Réponses: 13
    Dernier message: 07/02/2005, 16h18
  5. [MS-SQL]requete sur 3 tables
    Par pascalT dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/04/2003, 11h24

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