8768 sujets

Développement web côté serveur, CMS

Bonjour,

SELECT IF(longu='500', longt, longu) AS longu WHERE ... ORDER BY longu;


longu est de type FLOAT
longt est de tyoe CHAR

Le tri se fait comme si CHAR :

1 m
1,5 m
10 m
15 m
2 m

J'aimerais un tri comme FLOAT :

1 m
1,5 m
2 m
10 m
15 m

Bien sûr je peux re-trier par PHP mais n'y a-t-il pas une solution par MySQL ?
Bonjour,

J'ai adopté une solution plus simple :

SELECT longu, longt WHERE ... ORDER BY longu, longt;


Dans la réalité :
Soit tous les longu valent 500, les longt sont des STRING, tri alphabétique des strings.
Soit tous les longu ont une valeur numérique différente de 500, les longt sont NULL, tri numérique des DOUBLE.

Cela fonctionne.

L'ennui est que je récupère deux champs dans PHP, ce qui m'oblique à un code plus compliqué que si un seul champ.
Bonjour,

Le problème a été contourné plus que résolu mais comme le contour fonctionne bien je coche Résolu.
Salut,

(je trouve que c'est un peu de la bidouille, mais) tu dois pouvoir regarder du coté de la fonction CAST AS pour "transformer" les char en float pour faire ton tri.

Et au vu de la description de ton problème dans le 2e message j'ai l'impression que je ferai plutôt un union :
select longu from test where longu!=500
UNION
select longt from test where longu=500;

Mini test pour l'exemple :
https://www.db-fiddle.com/f/9y5wD3t1afmueW6378aeby/0
Bonjour,

CAST AS ou UNION, tu as sûrement raison.

Il se trouve que mon contournement fonctionne avec très peu de changements dans le code PHP en aval, il n'y a pas d'erreur logique et l'exécution est très rapide.

Ce n'est pas une priorité de l'améliorer mais je vais creuser tes deux pistes.
Modifié par boteha_2 (15 Oct 2024 - 11:36)