Version complète: sur le forum Webmaster Hub : SQL classement d"une requéte
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net
fat-freddy
Bonjour à tous !

Voila mon problème, j'ai une table avec les champs :

nom | type | date

Le type pouvant être : type1, type2, type3, type4

Je souhaiterai classer mes résultats de la requéte par date puis déterminer un ordre en fonction du type, c'est à dire mettre les type2 en premier puis type3, type4 et type1, lorque la date est la même.

Comment faire comprendre cela à la clause WHERE ??

J'espére avoir été clair, par avance merci B)
petit-ourson
Tu pourras pas en une seule table, il faut que tu "déportes" ton type dans une autre table et que tu gère une position de type soit un truc comme ca :

Table_1 : nom | id_type | date
Table_2 : id_type | position

et après tu fais une requête du type :

SELECT T1.nom, T1.id_type, T1.date
FROM Table_1 T1 INNER JOIN Table_2 T2 ON T1.id_type = T2.id_type
ORDER BY T1.date, T2.position

Enfin un truc dans cet optique car c'est encore l'heure de l'apéro et je suis pas sûr de ne pas metre planté ;o)
fat-freddy
Héhé merci, mais a vrai dire cette solution ne m'arrange pas du tout sad.gif

Etes vous sur qu'il n'y en a pas d'autre possible compte tenu de l'organisation de ma BDD ?
steph13
Heu, si, ca doit pouvoir se faire...

Avec une requête du type "select distinct date" et "group by type order by type desc" par exemple.

J'ai pas la requête sql exact en tête, mais cherche dans cette direction la.
petit-ourson
Comment tu peux dire que le type2 passe avant le type3 mais après le type4 qui est lui devant le type 1.

de toute façon, j'ai du mal a comprendre pourquoi tes types ne sont pas dans une table séparée.
sarc
Euh, tu peux trier comme ça en mettant ORDER BY colonne1, colonne2, colonne3...
Je suis quasiment sûr que ça marche comme ça, je vois pas pourquoi faire plusieurs requètes :/
petit-ourson
Si tu ne fais pas des tris croissants ou décroissants, tu peux pas vraiment trier avec un "order by" en sql.
loban
Tu peux t'en sortir en ajoutant une colonne de tri interne dans ta requête avec des opérateur IF.

Exemple :

SQL
SELECT IF(type='type1',4,0)+IF(type='type2',1,0)+IF(type='type3',2,0)+IF(type='type4',3,0) as coltri, nom, type, date
FROM latable ORDER BY 1


En fait, tu crées une colonne avec un remplacement de valeur pour qu'il corresponde au tri que tu souhaites.
Dans l'exemple, type2 arrivera en 1° position et type1 en dernière.
sarc
Ah oui j'avais pas vu qu'il voulait trier dans l'autre sens.. mea culpa !
Moi j'avais fait un truc bizarre pour trier dans un autre sens..
Exemple :
CODE
SELECT id, pseudo, type=2 AS flag1, type=4 AS flag2, [....], date order by date, flag1, flag2 [...]


Ca marchait à peu près correctement comme ça... Tu peux toujours tenter !

Edit : j'ai été grillé par une idée plus intéressante.. je connais pas encore assez bien sql tongue.gif
petit-ourson
N'"mpêche que je reste persuadé que dans le MLD c'est pas logique d'avoir le type à ce niveau là ;o)

Le IF est-il standardisé ??
Anonymus
je suis d'accord avec Petit-ourson, tu devrais modéliser la base en tenant compte du fait que l'ordre ne peut être stocké dans la même base que le type lui-même.
petit-ourson
Ah oui bon pour ceux que ça intéresse, le IF n'existe pas sous MS SQLServer donc on peut facilement remplacer par un CASE WHEN THEN bien que l'écriture de cette condition soit différente sous Oracle.
fat-freddy
Merci pour toutes vos réponses les gars, je vais esayer la solution de loban et si je ne m'en sors pas comme cela je réorganiserai ma base.. mais bon ca reviendrai à refaire tout le site aussi !
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.