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 et SQL. Discussion :

Rechercher toutes les commandes contenant plusieurs articles


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Rechercher toutes les commandes contenant plusieurs articles
    Bonjour,

    j'ai 1 table comme dans l'exemple ci dessous (c'est un exemple très épuré):

    commande articles
    001 velo
    002 tiroir
    003 bijou
    004 velo
    004 bijou
    005 velo
    006 tiroir
    006 bijou
    006 velo

    Je veux afficher les commandes contenant au minimum ces 2 articles: velo, bijou. les commandes peuvent contenir d'autres articles mais je veux au moins qu'elles contiennent les articles de ma requete. Donc en résultat je devrais voir les commande 004 et 006.

    J'ai fais multiples tantatives mais je seche... pourquoi suis sur que c'est tout bete...

    Merci d'avance pour votre aide

  2. #2
    Membre expert
    je seche... pourquoi suis sur que c'est tout bete...
    la solution, c'est souvent tout bête

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_comm.cde
    FROM T_comm INNER JOIN T_comm AS T_comm_1 ON T_comm.cde = T_comm_1.cde
    GROUP BY T_comm.cde, T_comm.art, T_comm_1.art
    HAVING (((T_comm.art)="velo") AND ((T_comm_1.art)="bijou"));
    "Always look at the bright side of life." Monty Python.

  3. #3
    Candidat au Club
    la réponse st toute bête mais pas si simple.... J'ai du mal avec ces inner join...

    Je vais mettre en application sur mon projet et tester cela...

    Merci beaucoup

  4. #4
    Candidat au Club
    Ca fonctionne merci beaucoup.

    Et maintenant si par exemple j'ai bien plus de code article. Si je veux avoir toutes les commandes contenant au moins les 8 codes articles... Je dois faire 8 INNER JOIN ? ou y aurait -il une autre manière de voir la requete ?

    Je comptais faire un formulaire avec une 10ene de champs code articles. Et en fonction du nombre de champs de remplis adapter ma requete dans le resultat... je sais pas si suis assez clair lol

  5. #5
    Responsable Arduino et Systèmes Embarqués

    Bonjour,

    Il y a bien quelque chose comme ça...
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT commande
    FROM maTable
    WHERE article in ('velo', 'bijou')
    GROUP BY commande
    HAVING count(*)=2;


    Mais à condition qu'on ne puisse pas commander un article plusieurs fois dans la même commande (clé primaire/unique sur (commande, article) ).

  6. #6
    Membre expert
    F_leb : très bonne idée ta requête !
    et du coup pour les éventuels doublons (Cde, article), ça devient simple de s'en affranchir : en s'appuyant sur une première requete qui élimine les doublons :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT R1.cde
    FROM (SELECT Cde, art FROM MaTable GROUP BY Cde, art) AS R1
    WHERE R1.[art] In ('velo','bijou')
    GROUP BY R1.cde
    HAVING Count(*) = 2;


    jojo0071 : tu auras certainement vu : si tu recherches n articles, il te faudra modifier "HAVING Count(*) = n "

    cordialement
    "Always look at the bright side of life." Monty Python.

  7. #7
    Candidat au Club
    Salut!

    Super merci à vous 2 F_leb et micniv. C'est niquel ca fonctionne très bien. J'avoue que j'ai du mal avec le Having. mes années d'études sont tellement loin...

    J'avou que j'au mal mal à comprendre ce que fait le "HAVING count * = 2". Cela compte le nombre de lignes? mais quel nombre de ligne ? Cela ne devrait pas limiter justement aux seuls commande contenant les n articles ? en excluant les commandes contenant d'autres articles en + ?

    Je me creuse les méninges pour essayer de comprendre mais j'avoue que j'ai du mal à la décortiquer...

  8. #8
    Responsable Arduino et Systèmes Embarqués

    Bonjour,

    Hé bien il faut y aller progressivement...

    En reprenant la table et les hypothèses de mon message précédent (ou en reprenant la sous-requête R1 de micniv au besoin) :
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT commande, count(*) as NbrArticles
    FROM maTable
    GROUP BY commande

    NbrArticles est le nombre d'articles par commande

    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT commande, count(*) as NbrArticles
    FROM maTable
    WHERE article in ('velo', 'bijou')
    GROUP BY commande

    NbrArticles est le nombre d'articles par commande parmi les commandes de 'velo' ou 'bijou'
    NbrArticles vaut 0 s'il n'y a ni 'velo' ni 'bijou' dans la commande.
    NbrArticles vaut 1 si dans la commande il y a commande de 'velo' ou de 'bijou' (soit l'un soit l'autre mais pas les deux).
    NbrArticles vaut 2 si dans la commande il y a commande de 'velo' ET de 'bijou'.

    NbrArticles=2 correspond à ce que tu veux, il reste à filtrer :
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT commande, count(*) as NbrArticles
    FROM maTable
    WHERE article in ('velo', 'bijou')
    GROUP BY commande
    HAVING count(*)=2

  9. #9
    Membre expert
    Bonjour jojo0071 (l'éternel étudiant ,enfin ... dans ton profil )

    je pense que la requete R1 de dédoublonnement ne te pose pas de problème de compréhension
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT Cde, art FROM MaTable GROUP BY Cde, art

    ainsi dans le résultat de R1 on ne trouve que des associations uniques (commande, article)

    et dans la requête composée
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT R1.cde
    FROM  R1
    WHERE R1.[art] In ('velo','bijou')
    GROUP BY R1.cde
    HAVING Count(*) = 2;

    on obtiendra count = 2 seulement si pour une commande donnée 'C1', on y trouve les tuples ('C1', 'velo') et ('C1', 'bijou')

    cordialement,
    pense à passer en résolu quand tu es OK
    "Always look at the bright side of life." Monty Python.

  10. #10
    Candidat au Club
    Bonjour à tous les 2,

    j'attendais le weekend pour répondre car je voulais cogiter à tète reposée. Pour te Répondre Micnic effectivement j'ai mis étudiant dans mon profil. Mes années d'etudes sont tellement loin que j'ai l'impression de tout reprendre à 0. j'ai des "restes" et des réflexs de ce temps la mais c'est si loin... du coup je prefere ne pas tromper le monde avec mon niveau lol.

    Alors j'ai compris votre décomposition et j'ai bien analyser mais la où je bloque encore, je suis désolé, c'est que le filtre Having Count (*) = 2 ne devrait pas justement m’afficher que les commandes contenant 2 articles seulement (contenant bijou ET Velo). Et non toutes les commandes contenant au moins 'velo' et 'bijou' ?

    Si on veut avoir les commandes contenant au moins velo ET bijou on ne devrait pas noter plutot:

    HAVING count (*) >= 2

    ?

    Si je comprends mal reprenez moi.

    Merci à vous 2

  11. #11
    Responsable Arduino et Systèmes Embarqués

    Bonsoir jojo0071,

    Je reprends ton exemple. Avec le WHERE article in ('velo', 'bijou'), tu élimines tout ce qui n'est pas 'bijou' ou 'velo', donc les 'tiroirs' dans les commandes 2 et 6.

    commande articles
    001 velo
    002 tiroir
    003 bijou
    004 velo
    004 bijou
    005 velo
    006 tiroir
    006 bijou
    006 velo

    En regroupant par commande (1 couleur par numéro de commande), tu te rends comptes que les commandes 4 et 6 qui t'intéressent comportent exactement deux lignes (1 pour 'bijou' et 1 pour 'velo').