MySQL: Ordre des champs (rien à voir avec ORDER BY)

Petit nouveau ! | 8 Messages

23 févr. 2006, 01:48

Salut :)

Je fais une requête qui sélectionne des ID avec IN(). Mais seulement, j'aimerais que les résultats retournés soient dans L'ordre des ID spécifiés dans IN(). Exemple:

Code : Tout sélectionner

SELECT information FROM table WHERE id IN(8,2,7,5,1)
Je voudrais que MySQL me retourne dans l'ordre des ID dans IN(), C'est-à-dire que ça me retourne les informations de l'ID 8, ensuites celles de l'ID 2, et ainsi de suite.

C'est possible ? :( J'ai fait plusieurs recherches sur internet mais sans résultats...

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

23 févr. 2006, 02:30

FIND_IN_SET() devrait correspondre à tes besoins, sinon tu peux essayer FIELD() (juste au dessus).

Code : Tout sélectionner

SELECT information FROM table WHERE id IN(8,2,7,5,1) ORDER BY FIND_IN_SET(id, '8,2,7,5,1')

Code : Tout sélectionner

SELECT information FROM table WHERE id IN(8,2,7,5,1) ORDER BY FIELD(id, 8, 2, 7, 5, 1)
Attention toutefois, ce genre de solution "atypique" est souvent le symptôme d'un algorithme qui aurait besoin d'être repensé.

Petit nouveau ! | 8 Messages

23 févr. 2006, 03:32

Ok merci, et c'est comment niveau performances ? Est-il plus avantageux de réordonner avec PHP après ?

Merci :)
#Edit: Et est-ce qu'il y a un équivalent avec les autres bases de données ? Car c'est pour un script et ce script supportera plusieurs BDD..

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

23 févr. 2006, 08:39

Pour les performances... je n'en sais rien, mais ça ne doit pas être particulièrement lent pour une requêtes de taille humaine (~25 enregistrements). Pour les autres SGBD... là encore c'est un mystère pour moi mais si tu veux faire du SQL "portable" alors il faudrait peut-être que tu revois ton algorithme.

Par exemple, comment est déterminé l'ordre des enregistrements ? cet ordre ne pourrait-il pas être enregistré dans une table, ou être calculé à partir des données d'une table ? auquel cas, c'est le chemin qui serait le plus recommandé.

Pour PHP, il ne trie pas les tableaux très vite et en plus cela signifie que tu dois récupérer l'intégralité des résultats avant de les trier et finalement de les utiliser, donc ce n'est envisageable que pour un petit set de résultat (< 30).

Petit nouveau ! | 8 Messages

24 févr. 2006, 03:35

En fait, c'est pour un forum :) On peut assigner plusieurs sous-forums..

Le requête sélectionne les bonnes permissions en dépendant des forums parents. Autrement dit, la requête sélectionne les permissions du forum courant, sinon elle recherche celles des forums parents.

Pour les performances je crois bien sur que SQL est plus rapide, d'autant plus que J'ai un LIMIT 0,1 pour ne sélectionner qu'une permissions; on n'a pas besoin des autres ! Comme tu dit, il faudrait obtenir tous les résultats ;)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

24 févr. 2006, 15:04

Dans ce cas, si l'ordre est basé sur le lien de parenté tu devrais être en mesure d'utiliser un ORDER BY sur une colonne. Au choix, si tu utilises un modèle de "liste adjacente" tu devrais stocker la profondeur de chaque forum (0 pour un forum, 1 pour sous-forum, 2 pour sous-sous-forum et ainsi de suite) et utiliser ce champs pour les trier.

Cet article pourra peut-être t'aider: http://sql.developpez.com/arborescence/
Si tu prends le temps de te faire à la "représentation intervallaire" tu verras que c'est très pratique et très puissant. Par exemple, il suffit d'ajouter "ORDER BY NFM_BG" à l'exemple 2.7 pour trier les parents du plus éloignés au plus proche.

Bon courage, ça vaut le coup ;)

Petit nouveau ! | 8 Messages

25 févr. 2006, 01:40

En fait la solution serait de mettre le nombre de parents dans un champs et d'ordonner avec ça. J'y avais pensé mais je croyais qu'on pouvait le faire avec une requête sans prob, enfin, je me suis trompé ;)

Sinon, merci pour ton lien, très utile, mais dans mon cas ça n'a pas vraiment d'utilité :)