2010-11-07 8 views
6

Je cherche à faire une commande par dans un certain ordre. Je sais que je peux modifier toute la base de données, mais je devrais alors modifier l'ensemble de la base de code. Ce que j'ai, c'est une colonne dans une table 'games' appelée 'status'.MySQL Order By Help!

Alors ...

SELECT * 
    FROM games 
ORDER BY status ASC -- Will retrieve results going from 0 then 1 then 2 

Ce que je cherche est de pouvoir commander par 1 puis 0 puis 2.

Toutes les idées ???

Répondre

4

Si je comprends bien, en utilisant un CASE expression:

SELECT g.* 
    FROM GAMES g 
ORDER BY CASE g.status 
      WHEN 0 THEN 1 
      WHEN 1 THEN 2 
      WHEN 2 THEN 3 
     END 

En utilisant FIND_IN_SET function:

SELECT g.* 
    FROM GAMES g 
ORDER BY FIND_IN_SET(g.status, '0,1,2') 

En utilisant FIELD function:

SELECT g.* 
    FROM GAMES g 
ORDER BY FIELD(g.status, 0, 1, 2) 
+0

cela aurait été la bonne réponse, mais le PO a demandé l'ordre 1,0,2 – ajacian81

+0

@ ajacian81: Le commentaire avant que cela contredit, mais je pense que la cohérence des exemples donne assez d'une idée pour savoir comment changer pour répondre aux besoins . –

2

Vous pouvez utiliser le champ():

SELECT * 
FROM games 
ORDER BY FIELD(status, 1, 0, 2) 

Mais il pourrait être préférable d'expliquer un peu plus ce que vous voulez faire, à savoir ce que votre table contient.

+0

c'est la bonne réponse. – ajacian81

0

Une autre option serait d'avoir une table de validation pour la colonne d'état, appelé quelque chose comme VAL_GAME_STATUS. GAMES.STATUS serait une clé étrangère à VAL_GAME_STATUS et VAL_GAME_STATUS migt ressembler à

CREATE TABLE VAL_GAME_STATUS -- Oracle format - modify as needed for other DB 
    (STATUS  NUMBER PRIMARY KEY, 
    DESCRIPTION VARCHAR2(50) NOT NULL UNIQUE, 
    SORT_ORDER NUMBER NOT NULL UNIQUE); 

Compte tenu de cela, la requête pour récupérer les résultats des jeux devient triés

SELECT g.* 
    FROM GAMES g 
INNER JOIN VAL_GAME_STATUS s 
    USING (STATUS) 
ORDER BY s.SORT_ORDER; 

L'inconvénient est que vous devez Faites une jointure pour trier les données, mais c'est un petit succès car VAL_GAME_STATUS est une petite table qui peut probablement être gardée en mémoire. L'avantage est que vous pouvez changer l'ordre de tri à la volée sans toucher votre code. L'ajout de nouvelles valeurs de statut avec un ordre de tri approprié est également facile.

Partagez et appréciez.