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!
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!
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!
... 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 ?
"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"!
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);
Ç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.
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.
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 !
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
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.
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.
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.
[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.
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !