Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête SQL URGENT !

URGENT !

Sujet résolu
    20 juillet 2022 à 22:25:34

    Bonjour ! Tout d'abord, merci d'avoir pris le temps de t'intéresser à mon interrogation. Sans plus tarder, voici mon problème :

    Notre professeur nous a donné ces tables à partir des quelles on doit obtenir certaines informations.

    Et l'une des question est la suivante : Donner les noms et descriptions des produits à plus de 100€ commandés par au moins 10 clients.

    Le chiffre de 10 est bien trop grands et ne me permet pas de faire des tests pour vérifier mes requêtes. Donc j'ai déterminé une nouvelle question qui est : Donner les noms et descriptions des produits à plus de 100€ commandés par au moins 1 client.

    Je dois trouver la réponse à celle-ci et j'aurai juste à changer 1 en 10.

    Aussi, j'ai rajouté des lignes à ce tableau pour pouvoir faire des tests. Car vous pouvez voir que dans "Produit", il n'y a pas d'articles de 100 euro ni de clients pour les acheter dans "Client", etc. Toujours pour vérifier mes requêtes j'ai donc rajouté différents éléments dans le tableau :

    Ajout d’un client faisant une commande de plus de 100 € : insert into client values ('cl3', 'Frelon', 'Jean', 'jf@mail.fr', 7777777) ;

    Ajout d’un article de plus de 100 € qui sera commandé : insert into produit values ('p3', 'classeur', 'classeur anneaux', 150, 45) ;

    Ajout de commandes de l'article de plus de 100€ :

    insert into ligne_commande values ('commande3', 'p3', 2, 0) ;

    insert into ligne_commande values ('commande4', 'p3', 2, 0) ;

    insert into ligne_commande values ('commande5', 'p3', 2, 0) ;

    Ajout de commandes de plus de 100 € pour cl2 et cl3 :

    insert into commande values ('commande3', '05/01/21', 'en attente', 'cl2') ;

    insert into commande values ('commande4', '05/01/21', 'en attente', 'cl2') ;

    insert into commande values ('commande5', '05/01/21', 'en attente', 'cl3') ;

    Ainsi le produit dont l'id est p3 est commandé par cl2 et cl3 !

    Cela donne le tableau suivant :

    J'y ai longtemps réfléchi mais je n'ai pas trouvé la réponse à la question. La requête que j'ai trouvé qui se rapproche le plus de cela est celle-ci :

    SELECT nomProduit, description, Produit.idProduit, count(distinct login), login from Produit, Ligne_commande, Commande

    WHERE Produit.idProduit = Ligne_commande.idProduit and Ligne_commande.numComm = Commande.numComm and prix > 100

    GROUP BY Produit.idProduit, nomProduit, description, login having count(distinct login) > 1 ;

    Mais cette dernière ne me renvoie rien.

    Pour vérifier, je fais exactement la même requête mais en changeant le signe ">" en "=" et j'ai pour résultat le nombre de client par produit de plus de 100 €. Soit :

    On constate donc bien que P3 est commandé par deux clients qui son cl2 et cl3 . 

    L'idéal serait donc reprendre cette requête et de faire la somme de ces clients mais un SUM[count (distinct login)] est impossible en SQL. Du coup je suis bloqué.

    Si vous pouvez m'aider, je vous en serais très reconnaissant. Merci d'avoir lu !

    -
    Edité par KuroWhite 20 juillet 2022 à 22:45:20

    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2022 à 10:05:37

      Bonjour KuroWhite, 

      Je ne suis pas un expert en SQL, mais je trouve ta requête étrange, néanmoins, elle retourne un résultat qui pourrait être pertinent pour ton problème.

      Cependant, voici ce que je j'aurai fait comme requête pour répondre à ton problème :

      SELECT 	P.nomProduit,
      	P.Descripion
      FROM Produit P
      INNER JOIN
      WHERE P.Prix > 100 
      AND 
      P.idProduit IN 
      (SELECT P2.idProduit FROM Ligne_commande LC
      INNER JOIN Commande C
      ON LC.numComm = C.numComm
      INNER JOIN Produit P2
      ON LC.idProduit = P2.idProduit
      GROUP BY P2.idProduit
      HAVING COUNT(DISTINCT C.Login) > 9)

      Je suppose qu'elle est loin d'être "optimisée", mais je te laisse tester si le résultat (si elle en retourne un) te convient.

      Tu peux changer la valeur à la dernière ligne de la requête (ici 9) pour faire tes tests selon le nombre de clients ayant commandé le produit. De plus, le "DISTINCT" dans le "COUNT()" sous-entend que le produit doit être commandé par x utilisateurs différents. 

      Bonne journée à toi

      -
      Edité par GreyDragon 21 juillet 2022 à 10:07:04

      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2022 à 10:40:52

        Bonjour,

        KuroWhite a écrit:

        Donner les noms et descriptions des produits à plus de 100€ commandés par au moins 10 clients

        Je ne sais pas si je passe à côté de quelque chose, mais je proposerai plutôt ceci :

        SELECT
        	P.idProduit,
        	P.nomProduit,
        	P.Description
        FROM
        	Produit P
        		INNER JOIN Ligne_commande L
        			ON L.idProduit = P.idProduit
        		INNER JOIN Commande C
        			ON C.numComm = L.numComm
        WHERE P.Prix > 100
        GROUP BY
        	P.idProduit,
        	P.nomProduit,
        	P.Description
        HAVING COUNT( DISTINCT C.Login ) >= 10

        Plus simple et plus direct ...

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          21 juillet 2022 à 21:30:59

          Bonjour GreyDragon.

          Merci d'avoir pris le temps de répondre à ma question. Je t'avoue que j'ai eu du mal à comprendre ta requête. Je n'ai pas bien compris pourquoi le premier INNER JOIN ne fait référence à aucun tableau.  En faisant quelques modifications à ce que tu m'as donné je pense que c'est ça que tu voulais me montre non ? 

          SELECT Produit.nomProduit,
                 Produit.Description
          FROM Produit
               INNER JOIN ligne_commande
                  ON Produit.idProduit = Ligne_commande.idProduit
          WHERE Produit.Prix > 100 and Produit.idProduit in
          ( 
           SELECT ligne_commande.idProduit
           FROM ligne_commande
                INNER JOIN Commande
                   ON ligne_commande.numComm = Commande.numComm
                INNER JOIN Produit
                   ON Produit.idProduit = ligne_commande.idProduit 
           GROUP BY ligne_commande.idProduit
           HAVING COUNT(DISTINCT Commande.Login) > 9
          ) ;

          En faisant cette requête ça marche correctement ! Merci beaucoup ! Mais l'id de l'article commandé un certain nombre de fois apparaît 3 fois pour moi. Tu penses savoir pourquoi ? Je pense que ça a un lien avec la manière dont j'ai rajouté les nouvelles lignes.

          Si ça t'intéresse, en me basant sur ce que tu as fait, moi j'ai cette syntaxe :

          SELECT nomProduit, Description
          FROM Produit, ligne_commande
          WHERE Produit.idProduit = Ligne_commande.idProduit and Produit.Prix > 100 and Produit.idProduit in
          (
           SELECT ligne_commande.idProduit
           FROM ligne_commande, Commande, Produit
           WHERE ligne_commande.numComm = Commande.numComm and 
                 Produit.idProduit = ligne_commande.idProduit
           GROUP BY ligne_commande.idProduit
           HAVING COUNT(DISTINCT Commande.Login) > 9
          ) ;

          Je la trouve plus simple à comprendre :)

          En tout cas tu m'as beaucoup aidé. Encore merci !!

          -
          Edité par KuroWhite 21 juillet 2022 à 21:32:24

          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2022 à 21:38:04

            As-tu lu mon post ci-dessus ?

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              21 juillet 2022 à 22:51:39

              Bonjour Benzouye !

              Merci beaucoup de ta réponse. Comme avec GreyDragon, j'ai dû faire quelques modifications sur la requête pour qu'elle marche. J'ai cette nouvelle version :

              SELECT Produit.idProduit, Produit.nomProduit, Produit.Description
              FROM Produit
                  INNER JOIN Ligne_commande
                    ON Ligne_commande.idProduit = Produit.idProduit 
                  INNER JOIN Commande
                    ON Commande.numComm = Ligne_commande.numComm
              WHERE Produit.Prix > 100
              GROUP BY Produit.idProduit, Produit.nomProduit, Produit.Description
              HAVING COUNT( DISTINCT Commande.Login ) >= 10 ;

               Et cette requête marche parfaitement ! C'est exactement ce que je voulais ! Merci beaucoup !!

              Je vais juste changer la syntaxe de la jointure. Je n'aime pas trop cette dernière. Je préfère ça :

              SELECT Produit.idProduit, nomProduit, Description
              FROM Produit, Ligne_commande, Commande
              WHERE Produit.idProduit = Ligne_commande.idProduit  
                    and Ligne_commande.numComm = Commande.numComm 
                    and Produit.Prix > 100
              GROUP BY Produit.idProduit, nomProduit, Description
              HAVING COUNT( DISTINCT Commande.Login ) >= 2 ;
              

               Je vais mettre cette requête dans mes réponses ! Encore une fois, merci beaucoup !!



              -
              Edité par KuroWhite 21 juillet 2022 à 22:52:20

              • Partager sur Facebook
              • Partager sur Twitter
                22 juillet 2022 à 0:05:05

                Les jointures via le WHERE sont un peu old school, et ne permettent pas les jointures externes facilement...

                Les JOIN ont été rajoutés au SQL justement pour spécialiser les jointures et ne laisser au WHERE que les conditions de filtrage.

                Les alias quant a eux sont une bonne façon de simplifier l'écriture des requêtes...

                • Partager sur Facebook
                • Partager sur Twitter
                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                  22 juillet 2022 à 11:03:38

                  Bonjour Benzouye, 

                  Ah ok je savais pas pour les jointures. Parce que depuis que j'ai commencé le SQL, on m'a toujours appris cette syntaxe. Et concernant les alias, je le connais mais pour une raison qui m'échappe, ils ne marchent pas avec le logiciel que j'utilise. Je précisé que c'est SQLPLUS.

                  -
                  Edité par KuroWhite 22 juillet 2022 à 11:03:59

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Requête SQL URGENT !

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown