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 :

Recherche de produits en fonction de plusieurs critères, perdu dans les jointures


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Points : 28
    Points
    28
    Par défaut Recherche de produits en fonction de plusieurs critères, perdu dans les jointures
    Bonjour,

    j'ai mes tables :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ARTICLE (art_id, titre)
    CRITERE (crit_id, titre)
    CRITERE_VALEUR(critval_id, crit_id, titre) 
    ARTICLE_CRITERE_VALEUR(art_id, critval_id)

    Par exemple, j'ai un article "robe" qui a 2 critères "type de robe" et "saison". "Type de robe" a plusieurs valeurs, "Robe de soirée", "Robe de mariage" , idem pour "saison" qui a comme valeurs "été" et "hiver" pour l'exemple.

    Je n'arrive pas à faire la requête pour me sortir les articles qui ont uniquement certains critères.

    Par exemple, comment avoir la liste des articles qui ont le critére_valeur "Robe de soirée" ET "été" ?

    Merci de votre précieuse aide, je suis perdu

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Commence déjà par lister toutes les "robes de soirée".
    Quelle requête écrirais-tu ?

    Ensuite, écris une autre requête pour lister tous les articles de la saison "été".

    Le résultat est à l'intersection des deux listes...

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 302
    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 302
    Points : 39 647
    Points
    39 647
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    La structure des tables me surprend :

    Si un article peut avoir plusieurs critères et qu'un critère peut correspondre à plusieurs articles, on ne devrait avoir que 3 tables :
    AR_Article : (AR_id, AR_reference, AR_designation...)
    CR_Crtitere : (CR_id, CR_code, CR_libelle...)
    AR_lien_CR : (AR_id#, CR_id#,...)

    Avec un tel modèle, la requête pour connaître les robes de soirée d'hiver devient tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select AR_id
         , AR_reference
         , AR_designation
    from AR_Article as AR
    inner join AR_lien_CR as AC1
       on AC1.AR_id = AR.AR_id
    inner join CR_critere as CR1
       on CR1.CR_id=AC1.CR_id
    inner join AR_lien_CR as AC2
       on AC2.AR_id = AR.AR_id
    inner join CR_critere as CR2
       on CR2.CR_id=AC2.CR_id
    where upper(CR1.CR_libelle)='ROBE DE SOIREE'
      and upper(CR2.CR_libelle)='HIVER'
    Ici le filtre est sur le libellé, mais dans la pratique, un filtre sur le code est préférable

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    la base a cette structure car j'utilise un ORM à savoir DOCTRINE sur Symfony.



    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    La structure des tables me surprend :

    Si un article peut avoir plusieurs critères et qu'un critère peut correspondre à plusieurs articles, on ne devrait avoir que 3 tables :
    AR_Article : (AR_id, AR_reference, AR_designation...)
    CR_Crtitere : (CR_id, CR_code, CR_libelle...)
    AR_lien_CR : (AR_id#, CR_id#,...)

    Avec un tel modèle, la requête pour connaître les robes de soirée d'hiver devient tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select AR_id
         , AR_reference
         , AR_designation
    from AR_Article as AR
    inner join AR_lien_CR as AC1
       on AC1.AR_id = AR.AR_id
    inner join CR_critere as CR1
       on CR1.CR_id=AC1.CR_id
    inner join AR_lien_CR as AC2
       on AC2.AR_id = AR.AR_id
    inner join CR_critere as CR2
       on CR2.CR_id=AC2.CR_id
    where upper(CR1.CR_libelle)='ROBE DE SOIREE'
      and upper(CR2.CR_libelle)='HIVER'
    Ici le filtre est sur le libellé, mais dans la pratique, un filtre sur le code est préférable

  5. #5
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 776
    Points : 1 488
    Points
    1 488
    Par défaut
    Citation Envoyé par zoocoral Voir le message
    la base a cette structure car j'utilise un ORM à savoir DOCTRINE sur Symfony.
    Heu... non.
    La structure de la base ne dépend pas de l'éditeur de l'ORM mais du modèle objet que tu y as soumis.

    Voyons ça de plus près :
    j'ai mes tables :
    ARTICLE (art_id, titre)
    CRITERE (crit_id, titre)
    CRITERE_VALEUR(critval_id, crit_id, titre)
    ARTICLE_CRITERE_VALEUR(art_id, critval_id)
    Avec ces tables on peut penser qu'il y a une chaine de dépendance :
    ARTICLE -- (art_id) -- ARTICLE_CRITERE_VALEUR -- (critval_id) -- CRITERE_VALEUR -- (crit_id) -- CRITERE

    Du point de vue sémantique, "titre" renvoie à quel attribut ?
    Normalement on prend soin de bien nommer ses attributs pour que le nom soit unique et porteur de sens.

    Si on alimente les tables pour correspondre à :
    Par exemple, j'ai un article "robe" qui a 2 critères "type de robe" et "saison". "Type de robe" a plusieurs valeurs, "Robe de soirée", "Robe de mariage" , idem pour "saison" qui a comme valeurs "été" et "hiver" pour l'exemple.
    ARTICLE (art_id, titre)
    1 robe
    2 chapeau

    CRITERE (crit_id, titre)
    1 Type de robe
    2 saison

    Et maintenant où stocke t'on
    "Type de robe" a plusieurs valeurs, "Robe de soirée", "Robe de mariage"

Discussions similaires

  1. [XL-2010] classement en fonction de plusieurs critères.
    Par nounous54 dans le forum Excel
    Réponses: 1
    Dernier message: 03/11/2014, 13h46
  2. [XL-2007] Recherche avec plusieurs critéres résultat dans une seul colonne
    Par guigui69 dans le forum Excel
    Réponses: 3
    Dernier message: 24/09/2014, 13h34
  3. Réponses: 1
    Dernier message: 19/06/2012, 16h24
  4. Réponses: 7
    Dernier message: 02/09/2010, 15h20
  5. Réponses: 3
    Dernier message: 15/01/2008, 00h28

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