[MySQL] order by Greatest ok mais pas Least
Maloooo
-
Johnny -
Johnny -
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,
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:
- [MySQL] order by Greatest ok mais pas Least
- Photos liked by ne fonctionne plus ✓ - Forum Facebook
- Comment faire ok sur une télé sans télécommande ✓ - Forum Téléviseurs
- Mysql community server - Télécharger - Bases de données
- Atout pique play ok - Forum Windows
- Autoradio ne fonctionne plus fusible ok - Forum Audio
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...
je comprends rien à la synthaxe mais ca fonctionne chez moi, alors si ca peut aider...
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.
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.