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 plusieurs lignes


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 36
    Points
    36
    Par défaut Select sur plusieurs lignes
    Bonjour,

    Je suis confronté à un problème qui à priori est enfantin alors soit je me complique la vie ou bien alors j'ai tout faux dans mes tables mais voici mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Produit
    id_produit
    description
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Attribut
    id_attribut
    libelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Produit_Attribut
    id_produit#
    id_attribut#
    Donc en gros, je relie un Produit à un Attribut via la table Produit_Attribut sachant qu'un produit peut avoir plusieurs Attribut (0,N)

    Donc comme enregistrement je peux avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 (id_produit) => 26 (id_attribut)
    1 => 45
    1 => 75
    Dans le cas où mon produit a 3 attribut par exemple.

    Ma question est simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM produit_attribut
    WHERE id_attribut = 26
    AND id_attribut = 45
    Je veux récupérer le produit qui possède l'attribut 26 MAIS AUSSI l'attribut 45

    Je ne vois pas comment faire et ça me bloque vraiment dans mon projet Je vous remercie et si besoin de plus d'information n'hésitez pas

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  *
    FROM    produit prd
    WHERE   EXISTS
            (   SELECT  1
                FROM    produit_attribut    rel
                WHERE   rel.id_attribut IN (26, 45)
                    AND rel.id_produit  = prd.id_produit
                HAVING  COUNT(*) = 2
            )
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 36
    Points
    36
    Par défaut
    Bonsoir,

    Merci beaucoup pour ta réponse.

    En effet ça fonctionne parfaitement mais pourrais tu juste m'expliquer le code s'il te plait? Que je ne recopie pas bêtement ^^ Je te remercie

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  *
    FROM    produit prd
    WHERE   EXISTS
            (   SELECT  1
                FROM    produit_attribut    rel
                WHERE   rel.id_attribut IN (26, 45)             
                    AND rel.id_produit  = prd.id_produit
            --  GROUP BY rel.id_produit
                HAVING  COUNT(*) = 2
            )
    Pour chaque id_produit de la table produit (lignes 1,2), on recherche (lignes 3,7) dans la table produit_attribut (lignes 4,5) les lignes qui possédent l'id_attribut 26 ou l'id_attribut 45 (ligne 6).
    Parmi ces lignes, on ne conserve que celles pour lesquelles les deux valeurs de l'attribut sont trouvées (ligne 9).
    Le regroupement (ligne 8) par id_produit dans la sous-requête (lignes 4 à 10) est implicite.
    Par ailleurs, le contenu des lignes retournées par la sous-requête n'a aucune utilité en dehors notre recherche de correspondance ; c'est pourquoi on peut mettre une valeur non significative dans le SELECT (ligne 4)

    La requête pourrait aussi s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  prd.*
    FROM    produit prd
        INNER JOIN
            (   SELECT  rel.id_produit
                FROM    produit_attribut    rel
                WHERE   rel.id_attribut IN (26, 45)             
                GROUP BY rel.id_produit
                HAVING  COUNT(*) = 2
            )   grp
            ON  grp.id_produit  = prd.id_produit
    Toutefois, la première notation a l'avantage de bien mettre en évidence que l'accès à la table produit_attribut n'est utile que pour restreindre (WHERE) la liste des lignes retournées.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/04/2013, 08h30
  2. Menu avec select sur plusieurs lignes
    Par jfox dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 23/07/2012, 15h11
  3. Requête SELECT contraintes sur plusieurs lignes
    Par beninsky dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/02/2010, 13h05
  4. select sur plusieurs lignes
    Par lcaya dans le forum SQL
    Réponses: 1
    Dernier message: 03/11/2009, 11h43
  5. Réponses: 8
    Dernier message: 09/07/2008, 13h09

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