Trie des résultats d'une requette

NoNos
Invité n'ayant pas de compte PHPfrance

16 mai 2005, 14:17

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

Mammouth du PHP | 983 Messages

16 mai 2005, 14:24

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 :wink:
Modifié en dernier par rami le 16 mai 2005, 14:24, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 mai 2005, 14:24

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

Eléphant du PHP | 147 Messages

16 mai 2005, 14:30

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

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 mai 2005, 14:34

Qu'appelles-tu "derniers enregistrements" ?
Les plus récents (cad derniers saisis) ou les plus chers, les moins chers ?

Eléphant du PHP | 147 Messages

16 mai 2005, 14:36

ceux sont les dernier saisis

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 mai 2005, 14:48

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

Eléphant du PHP | 147 Messages

16 mai 2005, 15:27

Il semble ne pas accepter la sous requette mais c'était pas con comme idées

Eléphant du PHP | 287 Messages

16 mai 2005, 16:19

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

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

16 mai 2005, 16:25

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

Eléphant du PHP | 287 Messages

16 mai 2005, 16:53

je vient de m'apercevoir que j'aifait une grosse erreur de logique alors ne prend pas en considération mon post :oops:

Eléphant du PHP | 287 Messages

16 mai 2005, 17:23

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.

Invité
Invité n'ayant pas de compte PHPfrance

16 mai 2005, 18:06

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é

Mammouth du PHP | 19672 Messages

16 mai 2005, 18:36

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 147 Messages

16 mai 2005, 18:40

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.