2009-08-07 5 views
20

Je souhaite faire une sélection sur une table et ordonner les résultats par un mot-clé ou une liste de mots-clés. Par exemple, j'ai une table comme ceci:Ordre SQL Par liste de chaînes?

ID Code 
1 Health 
2 Freeze 
3 Phone 
4 Phone 
5 Health 
6 Hot 

donc plutôt que de simplement faire un Order By asc/desc simple que je voudrais order by Health, Phone, Freeze, Hot. Est-ce possible?

+0

Pourquoi Phone est là deux fois? – pjp

Répondre

44

Essayez d'utiliser ceci:

select * from table 
order by FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot') 
+3

Ceci est la bonne solution selon les docs (section commentaires). Une bonne explication peut être trouvée [ici] (http://www.electrictoolbox.com/mysql-order-specific-field-values/) – kapad

+1

Sachez que la fonction FIELD() est spécifique à MySQL et peut ne pas fonctionner sur d'autres Serveurs de base de données SQL. – orrd

1

Oui joindre vos résultats à votre table de code puis par ordre code.CodeOrder

EDIT: explaing l'utilisation de la table de code ...

Créer une table séparée des codes (CodeId, Code, CodeOrder) et joindre à ceci et commander par CodeOrder. C'est plus agréable que de faire l'ordre par (cas ...) bidouille suggéré puisque vous pouvez facilement changer les codes et les ordres.

+0

Je pense que le point est que l'ordre désiré n'est pas le code ou l'ordre d'identification. – cletus

+0

Je supposais qu'il existe une table de codes avec l'ID de code et l'ID de commande. – pjp

12

Vous pouvez vous joindre à la table Keywords et inclure une colonne de séquence et ORDER BY Keyword.Sequence.

Exemple votre table de mots-clés ressemble à ceci:

ID Code  Sequence 
1 Health 1 
2 Freeze 3 
3 Phone 2 
4 Hot  4 

Ensuite, vous pouvez rejoindre.

SELECT * 
FROM MyTable INNER JOIN 
      Keywords ON Keywords.ID = MyTable.KeywordID 
ORDER BY Keywords.Sequence 

Espérons que cela vous donne l'idée.

3

options Couple:

  1. Ajouter une colonne de OrderCode avec ordre numérique souhaité

  2. Ajouter une table avec FK à ce tableau ID et OrderCode

10

Voici un horrible hack :

select * from table 
order by (
    case Code 
    when 'Health' then 0 
    when 'Phone' then 1 
    when 'Freeze' then 2 
    when 'Hot' then 3 
    end 
) 
+7

Je suis d'accord avec la partie "hack horrible" ;-) –

+1

Je suis d'accord aussi :), et cela fonctionne uniquement avec une liste statique, si un autre code a été ajouté à un moment donné dans le futur, la procédure de magasin devrait être refactorisée bien, pour s'adapter à ce changement. –

+0

Oui, ce serait un cul à maintenir et pas aussi beaugant que je voudrais, mais c'est ce que je vais devoir faire. J'ai déjà suggéré un – Tikeb

3

Est-ce juste un ORDER BY ou quelque chose que vous voulez faire souvent et sur plus de valeurs que spécifié ici?

L'ordre que vous avez donné est arbitraire, donc un identifiant doit être donné pour obtenir ce que vous voulez

SELECT 
    ID, 
    Code, 
    CASE Code 
     WHEN 'Health' THEN 1 
     WHEN 'Phone' THEN 2 
     WHEN 'Freeze' THEN 3 
     WHEN 'Hot' THEN 4 
    END As OrderBy 
FROM Table 
ORDER BY 
    OrderBy 

Ou

SELECT 
    ID, 
    Code 
FROM Table 
ORDER BY 
    CASE Code 
     WHEN 'Health' THEN 1 
     WHEN 'Phone' THEN 2 
     WHEN 'Freeze' THEN 3 
     WHEN 'Hot' THEN 4 
    END 

(je ne suis pas familier avec MySQL, mais ce qui précède fonctionnerait dans SQL Server.La syntaxe pour MySQL ne sera pas trop différente)

Si vous êtes susceptible de vouloir le faire souvent , puis créez une colonne OrderBy sur la table ou créez une table OrderBy avec un lien FK vers cette table et spécifiez un champ numérique OrderBy dans celle-ci.

2

Salut ceci est une requête SQL Server, mais je suis sûr que vous pouvez le faire en MySQL ainsi:

SELECT ID, Code 
FROM x 
ORDER BY 
    CASE Code WHEN 'Health' THEN 1 
       WHEN 'Phone' THEN 2 
       WHEN 'Freeze' THEN 4 
       WHEN 'Hot' THEN 5 
    ELSE 6 END ASC 
    , Code ASC 
4

Aujourd'hui MySQL a une fonction appelée find_in_set()

Utilisez comme ceci:

select * from table 
order by find_in_set(Code,'Health','Phone','Freeze','Hot') 
Questions connexes