2010-11-07 14 views
6

Estoy buscando hacer un pedido en cierto orden. Sé que puedo modificar toda la base de datos, pero luego tendría que modificar toda la base de códigos.Orden de MySQL por ayuda!

Lo que tengo, es una columna en una tabla 'juegos' llamada 'estado'.

Entonces ...

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

Lo que busco es ser capaz de ordenar por 1 y luego 0 después 2.

Alguna idea ???

Respuesta

4

si he entendido bien, usando 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 

Usando FIND_IN_SET function:

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

Usando FIELD function:

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

esto hubiera sido la respuesta correcta, pero el OP solicitó el pedido 1,0,2 – ajacian81

+0

@ ajacian81: El comentario anterior contradice, pero creo que la consistencia de los ejemplos da suficiente idea de cómo cambiar para adaptarse a las necesidades . –

2

Puede utilizar FIELD():

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

pero podría ser mejor explicar un poco más lo que quiere hacer, es decir, lo que la tabla contiene.

+0

esta es la respuesta correcta. – ajacian81

0

Otra opción sería tener una tabla de validación de la columna de estado, llamado algo así como VAL_GAME_STATUS. GAMES.STATUS sería una clave externa a VAL_GAME_STATUS y VAL_GAME_STATUS migt parecerse

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); 

Ante esto, la consulta para ir a buscar resultados ordenados de los juegos se convierte en

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

La desventaja aquí es que usted necesita Únete para obtener los datos ordenados, pero es un golpe menor, ya que VAL_GAME_STATUS es una tabla pequeña que probablemente pueda guardarse en la memoria. La ventaja es que puede cambiar el orden de clasificación sobre la marcha sin tocar su código. Agregar nuevos valores de estado con un orden de clasificación apropiado también se hace fácilmente.

Comparte y disfruta.