Partage
  • Partager sur Facebook
  • Partager sur Twitter

Plusieurs select dans une requete

    16 mars 2020 à 22:52:16

    Bonjour, je vous présente le contexte :

    Une table "Bar"

    Une table "client"

    Une table "Commande" qui contient l id du bar et celui du client qui correspondent à telle commande

    Je dois récupérer les 3 Clients qui ont le plus commander pour CHAQUE bar en une seule requête

    En effet, c est le "chaque" qui me pose problème. Y a t il un moyen d effectuer un SELECT couple à un LIMIT pour chaque ligne d une table au sein d une seule requête ? 

    • Partager sur Facebook
    • Partager sur Twitter
      17 mars 2020 à 9:51:38

      Bonjour,

      01001011 a écrit:

      les 3 Clients qui ont le plus commander pour CHAQUE bar en une seule requête

      ça va être chaud :p

      Pourquoi cette contrainte "en une seule requête" ? Pas de procédure ? Pas de vue ?

      Si plusieurs clients avec le même nombre de commandes, lequel on prend ? Si un bar n'a pas eu 3 ou 2 clients on affiche quand même ?

      -
      Edité par Benzouye 17 mars 2020 à 10:19:34

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        17 mars 2020 à 13:13:35

        Merci pour ta reponse si les vues et procédures sont autorisées mais même en sachant cela je ne sais pas comment procéder ^^

        Une seule requête parce que ce sont les instructions de mon exercice, oui on affiche dans la limite de 3 par bar 

        Ce sont des notions que je n ai pas encore vu j ai l impression je n ai jamais renvoyer plusieurs select en une requête donc je suis un peu perdu 

        • Partager sur Facebook
        • Partager sur Twitter
          17 mars 2020 à 14:25:13

          Si les procédures sont autorisées, il suffit de faire un curseur sur la liste des bras, et pour chacun stocker les 3 clients les plus commandeurs dans une table temporaire et de retourner le contenu de cette table en sortie ...

          Mais je ne vous pas l'intérêt de l'exercice du coup...

          Quel SGBD utilises-tu ?

          -
          Edité par Benzouye 17 mars 2020 à 14:26:00

          • 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 mars 2020 à 4:06:44

            Excusez pour ma réponse si tardive

            Justement avant de poser cette question je me suis taper le cours d'OC mais en utilisant les curseurs (comme présentés dans le cours), j'obtiens uniquement les 3 dernières lignes comme si seule la dernière ligne du bar avait été itérée par le curseur

            Comment insérer du contenu dans une table secondaire par itération ?

            J'avoue avoir beaucoup de mal avec la logique particulière de ce langage

            • Partager sur Facebook
            • Partager sur Twitter
              22 mars 2020 à 11:45:48

              Montre nous ton curseur ?
              • 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 mars 2020 à 22:33:56

                Voici mon code : 

                DELIMITER |
                CREATE PROCEDURE test()
                BEGIN
                	DECLARE _bar_id INT;
                    DECLARE fin BOOLEAN DEFAULT FALSE;
                    
                    DECLARE curs CURSOR FOR SELECT id FROM bar;
                    DECLARE continue handler for not found set fin = TRUE;
                    
                    OPEN curs ;
                    
                    loop_cursor: LOOP
                    	FETCH curs INTO _bar_id;
                    	SELECT lastName, firstName, COUNT(*) as nb,
                        name 
                        FROM user 
                        INNER JOIN freebeer ON freebeer.userID = user.ID
                        INNER JOIN bar ON bar.id = freebeer.barID
                        WHERE bar.id = _bar_id
                        GROUP BY user.id
                        ORDER BY nb DESC LIMIT 3;
                        
                        IF fin THEN LEAVE loop_cursor; END IF;
                        
                    END LOOP;
                        
                    CLOSE curs;
                        
                END |
                DELIMITER ;
                
                CALL test();
                
                



                -
                Edité par DavidFerlay1 22 mars 2020 à 22:39:23

                • Partager sur Facebook
                • Partager sur Twitter
                  23 mars 2020 à 0:27:26

                  Cette procédure fait bien l'itération attendue, maintenant il suffit juste de remplacer dans la boucle le SELECT par un INSERT INTO SELECT.

                  En ayant pris le soin de créer une table pour récupérer les 3 derniers par bar, et en faisant un SELECT sur cette table en fin de procédure...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    23 mars 2020 à 1:32:57

                    Merci pour ta réponse, J'ai tenté de créer une table dans ma procédure mais j'ai une erreur synthaxe. Je vais laisser tomber cet exercice merci quand même
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 mars 2020 à 9:45:45

                      Quelle persévérance...

                      Dommage...

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

                      Plusieurs select dans une requete

                      × 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