Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème requête select

Problème de limite requête select

Sujet résolu
    28 septembre 2016 à 21:30:42

    Bonjour à tous,

    J'ai un problème relativement embêtant pourtant surement simple à résoudre. Je fais un site pour une brasserie où je dois lister toutes les bières mises en vente par la société (environ 245). Pour cela je fais une requête simple :

    SELECT NomBiere
    FROM biere

    Seulement l'affichage dans la base et dans le site se limite à 96 bières. J'ai essayé en ajoutant "NO LIMIT" ou "LIMIT=245" mais avec la première j'ai une erreur de syntaxe et avec la deuxième le résultat est le même (c'est-à-dire 96).

    En plus ce n'est pas les 96 dans l'ordre alphabétique, la première et la dernière sont listées. Aussi, j'ai plusieurs bières qui ont le même nom (Leffe par exemple), j'en ai 8 au total mais que 4 qui sont listées.

    Voilà j'espère que je pourrais y voir un peu plus clair, merci pour votre aide :-)

    • Partager sur Facebook
    • Partager sur Twitter
      28 septembre 2016 à 22:30:15

      Bonsoir,

      Pour y voir plus clair, arrête la bière >_<

      En l'occurrence, avec cette requête, tous les résultats de ta table "biere" ressortent.

      Après tu peux trier par ordre alphabétique en ajoutant "ORDER BY <champ> ASC" (asc = ascending) ou "ORDER BY <champ> DESC" (desc = descending).

      Ce qui m'étonne c'est qu'il y a seulement 96 bières, avec ta requête tous les résultats doivent ressortir.

      La seule explication que j'ai c'est qu'il y a uniquement 96 lignes dans ta table... as-tu vérifié le nombre de lignes dans ta table ?

      -
      Edité par Xanatos 28 septembre 2016 à 22:37:45

      • Partager sur Facebook
      • Partager sur Twitter
        29 septembre 2016 à 11:30:00

        Bonjour,

        Je suppose que c'est parce que ton modèle de données est un peu plus complexe que ça non ?

        Concernant l'ordre alphabétique, voir ce que dit Xanatos.

        Ensuite, je suppose que tu as effectivement une table Biere qui contient 96 lignes. Si en réalité il y en a 245, ca doit être parce que les 245 se retrouvent dans une autre table.

        J'imagine que ta table Biere ne contient que le nom des marques (genre Leffe), alors qu'il y a une multitude de bières Leffe différentes (blonde, brune, royale, rituelle, royal (il y a plusieurs types de Leffe royale ;) ). Et en plus de ça, il y a aussi une histoire de volume non ? Genre la bouteille de 25cl, celle de 33cl, et celle de 75cl, voir même le fut de 5L.

        C'est encore une fois qu'une supposition, mais ca ne m'étonnerait pas que ces données soient stockées dans une autre table, et que tu le pourras les récupérer que via des jointures.

        • Partager sur Facebook
        • Partager sur Twitter
          29 septembre 2016 à 15:46:29

          Bonjour,

          Effectivement la requête est un peu plus complexe : je demande également l'affichage de la brasserie, la robe, le pays et le degré.

          La vraie tête de la requête c'est :

          SELECT * 
          FROM biere, capsule, robe 
          WHERE biere.NumRobe=robe.NumRobe
          AND biere.NumCapsule=capsule.NumCapsule
          ORDER BY NomBiere

          En faisant ça, tous les attributs sont sélectionnés et je trie à l'affichage.

          Quand j'effectue la requête dans phpMyAdmin j'ai le message : " Affichage des lignes 0 - 95 (total de 96, Traitement en 0.0028 sec) [NomBiere: 1664 - VAL DIEU]".

          Pourtant quand je vais dans la table "biere" et que je clique sur "afficher tout", j'ai le message : "Affichage des lignes 0 - 244 (total de 245, Traitement en 0.0035 sec)" avec en dessous la requête marquée :

          SELECT * 
          FROM `biere` 

          Ce qui est gênant c'est que la requête la plus simple (SELECT * FROM biere) m'affiche toutes les bières correctement mais dès que je fais des jointures et le ORDER BY ça bloque à 96 bières.

          • Partager sur Facebook
          • Partager sur Twitter
            29 septembre 2016 à 16:04:58

            Essaie avec ça, et dis moi si ça corrige ou non le résultat :

            SELECT *
            FROM biere b
            LEFT JOIN capsule c
            	ON b.NumCapsule = c.NumCapsule
            LEFT JOIN robe r
            	ON b.NumRobe = r.NumRobe
            ORDER BY NomBiere


            Si ca corrige le soucis, alors on verra pourquoi ensemble ^^

            • Partager sur Facebook
            • Partager sur Twitter
              29 septembre 2016 à 16:58:24

              Tiffado a écrit:

              Si ca corrige le soucis, alors on verra pourquoi ensemble ^^

              Héhéhé ... bien vu ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                30 septembre 2016 à 20:50:52

                Bonjour,

                J'hallucine ça marche :waw: !!! Par contre j'avoue que j'aimerais savoir pourquoi je n'ai jamais utilisé la commande LEFT JOIN :)

                En tous cas merci à vous ça va élargir mes connaissances en SQL

                • Partager sur Facebook
                • Partager sur Twitter
                  1 octobre 2016 à 13:43:38

                  Les jointures internes imposent la jointure. Les enregistrements sans équivalent avec les conditions de jointure ne sont pas retournés par la requête.

                  Les jointures externes (LEFT ou RIGHT JOIN) permettent de rendre la jointure "facultative". Si l'id à gauche de la jointure (LEFT JOIN) n'existe pas dans la table de droite alors l'enregistrement est quand même retourné.

                  Dans ton cas, si la mise en place des jointures externes te permet de retrouver toutes tes bières, c'est que pour plusieurs d'entre elles il n'y a pas d'équivalent dans les tables "de droite" (capsule et robe).

                  Cette requête :

                  SELECT b.*
                  FROM
                      biere b
                      LEFT JOIN capsule c
                          ON b.NumCapsule = c.NumCapsule
                  WHERE c.NumCapsule IS NULL
                  ORDER BY b.NomBiere;

                  Va te retourner les bières sans capsule associée.

                  De même, cette requête :

                  SELECT b.*
                  FROM
                      biere b
                      LEFT JOIN robe r
                          ON b.NumRobe = r.NumRobe
                  WHERE r.NumRobe IS NULL
                  ORDER BY b.NomBiere;

                  Va te retourner les bières sans robe associée.

                  Après il te faut déterminer si c'est que tu as des NumRobe et NumCapsule dans la table bière qui n'existent pas dans les tables correspondantes, ou que NumRobe ou NumCapsule n'est tout simplement pas renseigné dans la table bière.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    2 octobre 2016 à 20:52:29

                    Bonjour,

                    C'est exact certaines bières n'ont pas de NumCapsule. C'est surement l'explication du problème.

                    Merci beaucoup pour l'aide apportée.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 octobre 2016 à 11:40:33

                      Bjr, Ca fait plusieurs fois que je vous vois mettre "left join" pour résoudre des soucis sur ce forum, et moi je mets toujours "inner join". Quelle est la différence ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 octobre 2016 à 13:03:22

                        Bonjour,

                        La réponse est dans le sujet ... Lis plus haut :

                        Benzouye a écrit:

                        Les jointures internes imposent la jointure. Les enregistrements sans équivalent avec les conditions de jointure ne sont pas retournés par la requête.

                        Les jointures externes (LEFT ou RIGHT JOIN) permettent de rendre la jointure "facultative". Si l'id à gauche de la jointure (LEFT JOIN) n'existe pas dans la table de droite alors l'enregistrement est quand même retourné.

                        Après je te conseille de lire le cours MySQL (cf. ma signature), et plus particulièrement la partie sur les jointures ...

                        Ensuite, tu n'as pas dû chercher beaucoup avant de poser ta question ...

                        Enfin, tu aurais pu créer un autre sujet plutôt que de "polluer" celui-là ...

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

                        Problème requête select

                        × 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