[MySQL] order by Greatest ok mais pas Least

Fermé
Maloooo - 10 févr. 2011 à 21:40
 Johnny - 2 sept. 2013 à 07:06
Bonjour,

J'ai une base de données de produits avec prix, prix_promo. Je fais une requête selon certaines critères, et avec un tri selon la valeur des 2 champs réunis.
Pour le tri croissant, je fais :
SELECT * FROM produit, produit_detail WHERE categorie_id=32 AND publie=1 AND vendu=0 AND id_produit=produit_id AND detail_id=5 AND ((promo=0 AND prix BETWEEN 40000 AND 70000) OR (promo=1 AND prix_promo BETWEEN 40000 AND 70000)) GROUP BY id_produit ORDER BY GREATEST(prix_promo, prix)
Et cela fonctionne

Pour le tri décroissant, je remplace GREATEST par LEAST et cela ne fonctionne pas, mes champs ne sont pas triés.

Une idée ? merci de votre aide

Cordialement,
A voir également:

2 réponses

trouvé après quelques bidouilles : ORDER BY prix =0, IF( prix_promo, prix_promo, prix ) DESC
je comprends rien à la synthaxe mais ca fonctionne chez moi, alors si ca peut aider...
0
Voici une autre méthode. Cela se fait au niveau du SELECT. On va créer une colonne virtuelle par exemple prixPlusBas.

Pour cela on doit s'assurer que la valeur de la colonne prixPromo n'est pas égale à 0. Sinon le prixPromo à 0 qui n'est pas une vraie promo sera toujours affiché avant les autres vraies promos. C'est en fait ce problème que tu cherches à contourner.

Donc analyse ce que retourne LEAST. Si il retourne zéro on utilise la valeur du prix normal (nommons le prixTarifBase), si il ne retourne pas zéro on utilise le résultat donné par LEAST (c'est-à-dire la plus petite des deux valeurs).

Pour cela on place un IF et la valeur récupérée dans la sortie de valeur prixPlusBas.

Voici comment cela s'écrit :

if ((LEAST(prixTarifBase,prixPromo)>0),prixPromo,prixTarifBase) As prixPlusBas

C'est simple quand on a l'explication.

Dernière étape, dans la clause ORDER, utiliser la colonne virtuelle prixPlusBas pour classer ses résultats. Cela fonctionne même avec les anciennes versions de MySQL.
0