Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL] Faire un LIMIT avant un ORDER BY

Nested?

    17 octobre 2011 à 3:42:59

    Alors bonjours tout le monde, après avoir lu le tuto sur PHP/MySQL,je me suis lancé dans la création d'un site web.
    En gros le site gère une base de donnée de clients.

    Venu le temps de mettre en ordre alphabéthique un champs de la base de donnée, j'ai rencontré un petit problème.
    En effet, je veux limiter ma query à 30 clients avant de les mettres en ordre alphabéthique.
    J'ai beau chercher je trouve pas :( , que je le veuille ou non, le ORDER BY se fait toujours avant le LIMIT 0, 30 or moi je veux faire le LIMIT avant le ORDER BY.
    J'ai essayé:
    SELECT id FROM (SELECT id FROM clients LIMIT 0, 30) AS nom ORDER BY nom ASC
    

    J'ai également essayé toute sorte de variantes, mais rien n'y fait?

    Comment puis-je faire cette requête?
    Merci beaucoup!
    • Partager sur Facebook
    • Partager sur Twitter
      17 octobre 2011 à 7:07:19

      o_O pourquoi faire le order by après le limit ??
      • Partager sur Facebook
      • Partager sur Twitter
        17 octobre 2011 à 7:44:04

        Car je veux que les clients soient classés en ordre alphabétique avant de limiter ma requête.
        En fait, avec ma pagination, si je ne fais pas cela, je me retrouve avec un résultat à l'envers quand je
        classe ma requête et que je l'affiche! :p
        • Partager sur Facebook
        • Partager sur Twitter
          17 octobre 2011 à 8:45:26

          ... C'est pas très clair... Qu'appelles-tu un "résultat à l'envers"
          • Partager sur Facebook
          • Partager sur Twitter
            17 octobre 2011 à 9:40:30

            Exemple:
            table clients:
            =================
            id - nom
            -----------------
            23 - Nathalie
            43 - Bob
            21 - Samuel
            31 - Jacques
            22 - Alix
            37 - Vincent
            =================
            Bon alors, disons que je fais "SELECT * FROM client ORDER BY nom LIMIT 0, 3",ca me retourne "Alix, Bob, Jacques" or moi je veux que ca me retourne "Bob, Nathalie, Samuel".
            Le problème c'est justement que ca met la table en ordre (la requête en fait, mais bon, pour le besoin de la cause je simplifie) avant de faire couper le résultat avec LIMIT!

            C'est difficile à expliquer :P. Merci pour ton temps d'ailleurs!
            • Partager sur Facebook
            • Partager sur Twitter
              17 octobre 2011 à 9:43:12

              ... Je comprend que cette requête te retourne Alix, Bob, Jacques, mais je ne comprend pas à quoi correspond "Bob, Nathalie, Samuel". Ca ne correspond ni à un tri par id, ni par nom, alors c'est quoi le critère ?
              • Partager sur Facebook
              • Partager sur Twitter
                17 octobre 2011 à 10:22:54

                "Bob, Nathalie, Samuel" ça représente ma table, à laquelle j'ai appliqué un "LIMIT 0,3"
                ce qui me retourne: "Nathalie, Bob, Samuel"
                et ensuite à laquelle j'ai appliqué le "ORDER BY nom"
                ce qui me retourn: "Bob, Nathalie, Samuel"!

                Désolé si je ne suis pas clair :p
                • Partager sur Facebook
                • Partager sur Twitter
                  17 octobre 2011 à 10:26:59

                  T'es au courant que si tu ne définis pas un ordre avant LIMIT 0,3, tu ne peux pas être sûr de ce que MySQL te retournera ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 octobre 2011 à 10:28:02

                    Pour être honnête, non :P? C'est-à-dire?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 octobre 2011 à 10:33:08

                      Ben ca veut dire ce que ça veut dire... Si tu ne précises pas d'ordre, tu n'auras peut-êter pas ce que tu espères avoir...

                      Qu'espères-tu avoir ???
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 octobre 2011 à 10:34:57

                        En gros, j'aimerais récupérer ma table, la mettre en ordre alphabétique selon le champ "nom" et ensuite récupérer les 30 premières entrées!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 octobre 2011 à 10:37:50

                          ...Je croyais que tu voulais faire le LIMIT avant l'ORDER BY. Si tu te contredit, on en sort plus hein...

                          Et les 30 premières entrées, ça veut dire quoi ?? 30 premières par rapport à quoi ???
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 octobre 2011 à 10:43:31

                            Euh oui désolé, il se fait tard ici (5h du mat :-° ).
                            Enfin bon, je me corrige:

                            j'aimerais récupérer ma table, prendre les 30 premières entrées (comme dans LIMIT 0, 30) et ensuite les mettre en ordres alphabétique.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 octobre 2011 à 10:44:07

                              Et bien c'est ce que tu fais avec ta requête...

                              "SELECT * FROM client ORDER BY nom LIMIT 0, 30"
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 octobre 2011 à 10:47:51

                                Citation : Jack

                                Et bien c'est ce que tu fais avec ta requête...

                                "SELECT * FROM client ORDER BY nom LIMIT 0, 30"



                                Non, désolé je me suis corrigé :p .
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 octobre 2011 à 10:50:06

                                  Citation : Taguan

                                  Et les 30 premières entrées, ça veut dire quoi ?? 30 premières par rapport à quoi ???

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 octobre 2011 à 11:05:58

                                    Si j'ai bien compris, ce n'est pas possible seulement en SQL.

                                    <?php
                                    // On récupère les 30 noms
                                    $req = $db->query('SELECT nom FROM clients LIMIT 30');
                                    $listeNoms = $req->fetchAll(PDO::FETCH_ASSOC);
                                    
                                    // On trie ce résultat
                                    sort($listeNoms);
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 octobre 2011 à 14:46:02

                                      Ça n'a simplement aucun sens de faire cela à partir du moment où on sait qu'il n'y a pas d'ordre dans une table. Aussi bien sélectionner 30 lignes de façon aléatoire.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 octobre 2011 à 15:23:49

                                        SELECT id FROM clients where id in(SELECT id FROM clients ORDER BY id LIMIT 0, 30)ORDER BY nom ASC
                                        

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          17 octobre 2011 à 16:31:58

                                          ... qui est équivalent à SELECT id FROM clients ORDER BY id, nom LIMIT 30;
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            17 octobre 2011 à 20:41:26

                                            Citation : Fayden

                                            Aussi bien sélectionner 30 lignes de façon aléatoire.



                                            Cette requête répond à la question originale :

                                            SELECT * FROM 
                                            (SELECT * FROM tatable LIMIT 30)
                                            ORDER BY nom
                                            


                                            Sa traduction en français est : "prends les 30 premières lignes que tu trouves dans la table, n'importe lesquelles, et trie le tout par nom". C'est une requête qui ne sert à rien.

                                            La question est mal posée, comme dit fayden....

                                            "les 30 premières lignes" ne veut rien dire si il n'y a pas de relation d'ordre, comme par exemple : dans le même ordre qu'on a inséré les lignes, trié par un timestamp quelconque, par nom, etc.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              17 octobre 2011 à 23:07:54

                                              Je le fait dans le contexte ou, mes ~180 entrées sont diviser en 6 pages, soit 30 par pages.
                                              Je veux quand je clique sur un bouton, ca recharge la page, avec les mêmes 30 entrées, mais cette fois mises en ordre alphabétique.
                                              Je veux que ma page soit mise en ordre, mais seulement cette page la, et non toute la requête. Ca donne pas la même chose!
                                              Enfin bon! Merci beaucoup pour l'aide, j'avais de la difficultée à expliquer mon problème :p !
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                18 octobre 2011 à 9:55:08

                                                ok, on approche

                                                quel est l'ordre utilisé pour la pagination ?
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  17 janvier 2019 à 12:04:19

                                                  Bonjour,

                                                  Je déterre ce sujet, car j'ai en ce moment exactement le même problème. Je fais une page de consultation de ma base de données, et elle est divisée en pagination qui affiche les résultats par LIMIT 0,20, 20,20; 40,20, etc.

                                                  J'ai aussi un bouton ▲▼ qui change une variable en ASC, ou DEC si je clique dessus.

                                                  Mais quand j'affiche les résultats de la base avec une LIMIT, par exemple 40,20, si je clique sur le bouton ▲▼ pour les ordonner en ASC, ou DESC, ça ne va pas garder les mêmes 20 résultats. (à moins qu'il n'y en ait que 20 dans la table ^_^).

                                                  -
                                                  Edité par RaoulDouglas 17 janvier 2019 à 12:08:14

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    17 janvier 2019 à 14:43:04

                                                    Et bien, pour reprendre les arguments des autres, c'est dans un sens assez logique de faire un tri sur la totalité des données sur toutes tes pages.

                                                    Genre j'ai 100 clients, et je veux récup les 10 premiers par ordre alphabétique, bah je tri la totalité, puis j'affiche que les 20 premiers de mon tri.

                                                    Donc fonctionnellement parlant, je vois pas l'intérêt, à part perdre le client avec des règles de gestion complètement chelous. Parce que quand moi je tri un tableau, je m'attend à ce que tout soit trié.

                                                    Sinon, si pour une quelconque raison ce que tu demandes à un vrai sens fonctionnel, je pense que tu devras te contenter de faire le tri dans le code et non pas dans la requête.

                                                    Le but d'une requête, c'est de remonter tes données de la base. Une fois qu'elles sont chargées, c'est bête d'aller retourner en base juste pour changer leur ordre.

                                                    Le but d'une pagination, c'est autant fonctionnel que technique. Fonctionnel car c'est plus pratique de n'avoir que 20-50 éléments par page au lieu de 3000 car on s'y perd. Et technique parce que permet d'alléger la requête et le réseau (on remonte moins d'éléments, donc vitesse de requête plus rapide).

                                                    Tout ça pour dire qu'une fois que tes données sont remontées, pas besoin d'aller retaper en base.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 janvier 2019 à 17:32:56

                                                      Oui, je suis tout à fait d'accord. Je m'en suis rendu compte en terminant mon code. Je voulais faire la même chose que l'initiateur de ce sujet, mais au final j'ai réalisé que comme tu dis, ça n'a pas vraiment (ou peu) d'intérêt.

                                                      Mais comme je me suis retrouvé face au même questionnement, et que je suis tombé sur ce topic où personne ne semblait comprendre ce que voulait le demandeur, je me suis permis de remonter le sujet. >.<'

                                                      Après, je pense que ça reste quand même un problème intéressant, étant donné qu'on n'a pas eu de réponse.

                                                      Dans une pagination, comment trier seulement les 20 champs retournés ?

                                                      Par exemple, je suis en page 3, j'ai les données 40 à 60

                                                      Comment faire pour les inverser et afficher DESC (les données 60 à 40), tout en restant sur la page 3 ?

                                                      Personnellement, je ne vais finalement pas m'en servir, mais comme j'ai buté sur le problème tout à l'heure, je suis curieux. :p

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        17 janvier 2019 à 17:49:56

                                                        Et bien, la solution a déjà été apportée : tu fais ton select LIMIT 40;20; et la dessus tu ferais un SELECT avec ton order by.

                                                        Mais comme je l'ai dit plus haut, si tes données sont déjà remontées, ce qui semble être le cas vu que tu cliques sur une flèche, il faut que tu fasses un tri avec ton code, et pas dans ta requête.

                                                        Comment ? Bah ca dépendra de si tu es en PHP, Java, Python, JS ou je sais quoi.

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        [SQL] Faire un LIMIT avant un ORDER BY

                                                        × 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