2010-12-01 12 views
8

Est-il possible de spécifier un ordre arbitraire pour une instruction MySQL SELECT? Par exemple,MySQL spécifie un ordre arbitraire par l'ID

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY (1, 3, 2, 9, 7); 

L'ordre des numéros indiqués ci-après directement IN ne semblent pas à la matière.

+0

@MattDiPasquale - Vous avez déjà un ordre dans '1,3,2,9,7', chargez simplement les résultats pour' 1,2,3,9,7', et réglez-le en fonction de l'ordre de '1 , 3,2,9,7 ». N'importe quel langage de programmation? – ajreal

+0

J'utilise WordPress, PHP. Je voudrais tout faire en MySQL pour ne pas avoir à faire de traitement en PHP. – ma11hew28

+0

@MattDiPasquale - 'find_in_set' n'est pas rapide et pas très optimisé. Le faire en PHP est plus rapide et optimisé. – ajreal

Répondre

11

fonction FIND_IN_SET fera l'affaire

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY FIND_IN_SET(id, '1,3,2,9,7'); 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

EDIT: Notez l'absence d'espaces dans l'argument de chaîne de la fonction FIND_IN_SET.

+0

Avez-vous testé cela? Quand je l'ai essayé, j'ai eu l'ordre: 2, 3, 7, 9, 1, ce qui est incorrect – ma11hew28

+0

enlever les espaces –

+0

Oh, sympa! Merci, ça a marché! – ma11hew28

0

Réponse facile:

Instrument vos données avec un autre champ int "de commande" et ORDER BY ce domaine. Cela devrait être tout ce qui est nécessaire la plupart du temps. Je l'ai fait avec succès où les clients peuvent faire grimper certains produits dans une liste en vedette, etc. en appliquant des valeurs faibles comme -1 ou -99 dans le champ de commande.

réponse complexe:

Cela s'appliquerait si vous vouliez normaliser cette commande, et peut-être si vous aviez un autre domaine que le deuxième facteur dans l'ordre, qui est déjà dans votre table principale. Cela aiderait également si vous avez d'autres informations associées à chaque point de commande, comme une note. Ou, si beaucoup de tables vont implémenter cet ordre arbitraire, et que vous voulez orchestrer/modifier cet ordre d'un endroit.

ce que vous faire est de placer l'ordre « arbitraire » dans une table, vous pouvez rejoindre puis de commander par ce champ:

SELECT t.*, o.ordering 
FROM table_name AS t 
LEFT JOIN table_name_ordering AS o ON t.ordering_id = o.id 
ORDER BY o.ordering, t.other_field 
4

Découvrez mysql de ORDER BY FIELD. Je pense que ça va faire exactement ce que tu veux.

+0

Est-ce plus rapide que FIND_IN_SET? Je parie que c'est le cas, car il n'a pas de syntaxe d'analyse de chaîne comme FIND_IN_SET. La syntaxe que je crois est: 'ORDER BY FIELD (id, 1,3,2,9,7)' – Ciantic