8791 sujets

Développement web côté serveur, CMS

bonjour,

J'ai un problème de tri avec order by

$query = "SELECT * FROM menu ORDER BY position";


Il me faut passer la position 10 avec 2
c a d :
1 blabla1
10 blabla10
2 blabla2

au lieu de
1 blabla1
2 blabla2
10 blabla10

Pourquoi et comment regler le prob?

Merci
Cédric
Modifié par drick (01 Oct 2012 - 13:10)
Le principe de ORDER BY, c'est de trier de manière croissante ou décroissante un champ de table. Ici, si ton champs position est en int, tu ne pourras trier que de ces manières :

1 - 2 -10 ou 10 - 2 -1

Après je dis peut être une bêtise, je n'ai pas testé, mais peut être que si ton champ est en varchar, tu pourras avoir 1 - 10 - 2 mais je n'en suis pas sur du tout.
alors j'étais déjà en varchar car mes positions ont des sous-titre du type 1-2-5 et avec int ceci ne fonction pas, avec int l'ordre croissant fonctionne bien mais pas avec varchar.

Comment faire?


Table
-----
id lot position
1 Parquet 23
39 Parquet contrecollé 23-1
40 Parquet massif 23-2
30 Parquet contrecollé 23-3
31 Parquet massif 23-4
33 Parquet stratifié 23-5
34 Quincaillerie 23-6 12-6


Merci
Cédric
Je pense que tu as surtout un problème de structure de table. Une position, pour moi, doit être un chiffre, et doit servir à positionner Smiley cligne (donc pas de 23-1, 23-2, 23-4-6-12, etc...)

Si tu t'en sers pour faire des catégories, et sous catégories, ça va vite être le souk.

Pouquoi ne pas faire quelque chose du genre :

id - id_parent - lot - position
1 - 0 - Parquet - 1
2 - 1 - Parquet contrecollé - 1
3 - 1 - Parquet massif - 2
4 - 1 - Parquet stratifié - 3
5 - 0 - Quincaillerie - 2

Ca te donne des rubriques (avec l'id_parent 0) avec leur position respective (parquet = 1, quincaillerie = 2) et des sous-rubriques (les différents parquets dépendent de l'élément d'id 1 - le parquet) avec leur positions à l'intérieur de cette rubrique.

Ensuite avec deux boucles imbriquées tu peux trier comme tu veux

$req_cat = mysql_query("SELECT * FROM menu WHERE id_parent = 0 ORDER BY position");
while ($res_cat = mysql_fetch_object($req_cat))
{
     echo '<a href="?id='.$res_cat->id.'">'.ucfirst(stripslashes($res_cat->lot)).'</a>';

     $req_sous_cat = mysql_query("SELECT * FROM menu WHERE id_parent = '".$res_cat->id_parent."' ORDER BY position");
     while ($res_sous_cat = mysql_fetch_object($req_sous_cat))
     {
           echo '<a href="?id='.$res_sous_cat->id.'">'.ucfirst(stripslashes($res_sous_cat->lot)).'</a>';
     }
}
exacte, mon problème, le nombre de sous-categorie n'est pas fixé, il faut peut en avoir 1 comme 6, 8 ou 20 sous catégorie

quoi que, ... si il y a en 5 c'est deja pas mal !!
Modifié par drick (01 Oct 2012 - 15:59)
il te manque surtout l'instruction de l'ordre

ORDER BY position ASC


ASC = croissant
DESC = décroissant
Modifié par Super_baloo8 (01 Oct 2012 - 22:22)
Ca ne change rien puisque par défaut c'est en ASC.

Par contre 5 niveaux d'arbo... Tu comptes tous les afficher dans ton menu ? Je ne suis vraiment pas sur que ce soit une bonne idée, déjà que 3 ça commence à faire beaucoup.
Salut,

ça s'appel le tri par ordre naturel (voir google), impossible en SQL mais il existe la fonction natsort en PHP