2009-03-24 5 views
3

J'ai une requête SQL assez simple mais quelque chose manque et je n'ai pas encore trouvé de réponse à ce problème. Le fait est que je sélectionne des champs avec plusieurs identifiants et je veux que le résultat soit ordonné dans cet ordre particulier.MySQL ORDER problème

La requête est la suivante

SELECT `content`.* 
FROM `content` 
WHERE (user_id = "1" AND (id = "4" OR id = "7" OR id = "5" OR id = "8")) 

L'ordre par défaut est « id ASC » (id est ma clé primaire), mais je veux l'ordre d'être 4,7,5,8 dans ce cas particulier .

Des idées?

Répondre

5

Cela va faire ce que vous voulez:

select * 
from myTable 
order by field(myID, 8, 7, 6) desc; 

Vous pouvez définir l'ordre de tout ID de (ou autre) youwant à apparaître, et les autres suivront après. J'espère que cela pourra aider.

Plus sur cette @http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

+0

Plus rapide que la solution de le dorfier et plus facile à implémenter dans Zend_Db de Zend Framework select(). Je vous remercie! –

10
ORDER BY CASE user_id 
    WHEN "4" THEN 1 
    WHEN "7" THEN 2 
    WHEN "5" THEN 3 
    WHEN "8" THEN 4 
    ELSE 5 
END 

Si vous voulez généraliser, vous pouvez créer une nouvelle table avec deux colonnes - "user_id" et "order_by_val", joignez-vous à lui, et "ORDER BY order_by_val".


EDIT: Par @ Tim, MySQL a une fonction exclusive - CHAMP() - comme indiqué dans son poste, si vous n'êtes pas préoccupé par la portabilité ou la question qui fonctionnent les valeurs de retour sont unoptimizable.

+0

Grand, ne savait pas. Merci :) –

+0

Vous pouvez également regarder field(), j'ai montré un exemple de code pour cela ci-dessous aussi. Le code ci-dessus semble un peu plus verbeux et encombré. – Tim

+0

@Tim, je n'étais pas au courant de cette fonction - c'est pratique à savoir (bien que propriétaire, et pourrait créer des problèmes d'optimisabilité, comme vous le savez sûrement - pas un problème avec les listes restreintes.) – dkretz

3

La façon dont je normalement faire ce genre de commande étrange est d'utiliser une déclaration de cas:

order by case id 
      when "4" then 1 
      when "7" then 2 
      when "5" then 3 
      when "8" then 4 
      else 99 
     end 

Je ne sais pas si cela se traduit directement à MySQL, mais l'idée devrait le faire.

1
ORDER BY CASE id WHEN 4 THEN 1 
       WHEN 7 THEN 2 
       WHEN 5 THEN 3 
       WHEN 8 THEN 4 
       ELSE 99 
     END; 
0

Vous pouvez essayer d'ajouter ce qui suit à la fin de votre requête.

ORDER BY CASE ID WHEN 4 THEN 1 WHEN 7 THEN 2 WHEN 5 THEN 3 WHEN 8 THEN 4 ELSE 5 END