Page 1 sur 2
Trie des résultats d'une requette
Posté : 16 mai 2005, 14:17
par NoNos
Bonjour
Je souhaite faire une requette qui affiche les 30 dernier élément de ma table et pouvoir fair un tri soit par prix, auteur, ou numéro. Pour avoir les 30 dernier enregistrement j'utilise LIMIT et pour le tri j'ulie ORDER BY. ma equette donne cela :
SELECT numlivre, titre, auteur, description, editeur,
année, taille, etat, detail, estimation, numero_theme FROM Livres
WHERE ".$critère."
ORDER BY ".$ordre." DESC
LIMIT ".$debut.", 30";
Le problème arrive l'osque je veus trié par prix il me sort les 30 enregistrements les plus chers au lieu de me donner les 30 derniers enregistrement classé par prix
Merci d'avance
NoNo
Posté : 16 mai 2005, 14:24
par rami
SELECT numlivre, titre, auteur, description, editeur,
année, taille, etat, detail, estimation, numero_theme FROM Livres
WHERE ".$critère."
ORDER BY ".$ordre."
LIMIT ".$debut.", 30";
Le DESC trie par ordre décroissant

Re: Trie des résultats d'une requette
Posté : 16 mai 2005, 14:24
par albat
Déjà, il serait bon d'inclure le champ
prix dans le
SELECT de ta requête.
Ensuite, si tu as fait le bon choix d'utiliser
numlivre comme clé primaire
et l'as donc défini comme un entier auto-incrémenté,
les 30 valeurs les plus élevées de
numlivre te donnnent les 30 livres les plus récents.
Code : Tout sélectionner
SELECT numlivre, titre, auteur, prix
FROM Livres
ORDER BY num_livre DESC, prix
LIMIT 0, 30
Posté : 16 mai 2005, 14:30
par NoNos
Le champ estimation contient le prix.
Quand je veus trier par prix il ne doit plus etre trié par numlivre, mais le tris doit porter que sur les 30 derniers enregistrments
Posté : 16 mai 2005, 14:34
par albat
Qu'appelles-tu "derniers enregistrements" ?
Les plus récents (cad derniers saisis) ou les plus chers, les moins chers ?
Posté : 16 mai 2005, 14:36
par NoNos
ceux sont les dernier saisis
Re: Trie des résultats d'une requette
Posté : 16 mai 2005, 14:48
par albat
Code : Tout sélectionner
SELECT *
FROM (SELECT numlivre, titre, auteur, estimation
FROM Livres
ORDER BY num_livre DESC
LIMIT 0, 30)
ORDER BY estimation DESC
Posté : 16 mai 2005, 15:27
par NoNos
Il semble ne pas accepter la sous requette mais c'était pas con comme idées
Posté : 16 mai 2005, 16:19
par thierry
salut,
toujours en supposant que ta clef primaire num_livre est auto incrémentée.
essaie ça:
SELECT numlivre, titre, auteur, description, editeur,
année, taille, etat, detail, estimation, numero_theme
FROM Livres
WHERE ".$critère."
GROUP BY numlivre
HAVING numlivre > ( max( numlivre ) - 30 )
ORDER BY ".$ordre."
thierry
Posté : 16 mai 2005, 16:25
par albat
Il semble ne pas accepter la sous requette
Quelle version de MySQL utilises-tu ?
Les requêtes imbriquées sont acceptés à partir de la 4.1.
http://dev.mysql.com/doc/mysql/fr/subqueries.html
Posté : 16 mai 2005, 16:53
par thierry
je vient de m'apercevoir que j'aifait une grosse erreur de logique alors ne prend pas en considération mon post

Posté : 16 mai 2005, 17:23
par thierry
comme ça c'est mieux:
SELECT b.numlivre, b.titre, b.auteur, b.description, b.editeur,
b.année, b.taille, b.etat, b.detail, b.estimation, b.numero_theme
FROM Livres as a
CROSS JOIN Livres as b
WHERE ".$critère."
GROUP BY b.numlivre
HAVING numlivre > ( max( a.numlivre ) - 30 )
ORDER BY ".$ordre."
n'oubli pas de mettre les alias 'b' sur les clauses where et order by.
Posté : 16 mai 2005, 18:06
par Invité
thierry tu pourais m'expliquer un peu ta solution je comprend pas comment tu as raisonner.
Malheureusement ta solution ne marche pas peu etre que c'est parce qu'il peut y avoir des trou dans ma clé
Posté : 16 mai 2005, 18:36
par Cyrano
comme ça c'est mieux:
SELECT b.numlivre, b.titre, b.auteur, b.description, b.editeur,
b.année, b.taille, b.etat, b.detail, b.estimation, b.numero_theme
FROM Livres as a
CROSS JOIN Livres as b
WHERE ".$critère."
GROUP BY b.numlivre
HAVING numlivre > ( max( a.numlivre ) - 30 )
ORDER BY ".$ordre."
n'oubli pas de mettre les alias 'b' sur les clauses where et order by.
Pas convaincu : si une des dernières titres inscrit a été effacé pour une raison x ou y, ton (MAX(a.numlivre) - 30) ne retournera pas 30 mais 29 résultats.
Faire ça en une seule requête sans pouvoir faire de requêtes imbriquées, ça pose un problème... je n'ai pas trouvé la solution autrement qu'en le faisant par programmation sur un simple ORDER BY des derniers enregistrements.
Posté : 16 mai 2005, 18:40
par NoNos
Ma base de données est hebergée chez free et la version de mysql est la 4.0.22 donc pour les sous requettes c mort.