2009-08-07 10 views
20

Deseo hacer una selección en una tabla y ordenar los resultados por una determinada palabra clave o lista de palabras clave. Por ejemplo, tengo una tabla de este modo:Orden SQL ¿Por lista de cadenas?

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

así en lugar de sólo hacer una simple Order By asc/desc me gustaría order by Health, Phone, Freeze, Hot. es posible?

+0

¿Por qué el teléfono está allí dos veces? – pjp

Respuesta

44

Trate de usar esto:

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

Esta es la solución adecuada según los documentos (sección de comentarios). Se puede encontrar una buena explicación [aquí] (http://www.electrictoolbox.com/mysql-order-specific-field-values/) – kapad

+1

Tenga en cuenta que la función FIELD() es específica de MySQL y puede que no funcione en otra Servidores de bases de datos SQL – orrd

1

Sí se unen a los resultados a su tabla de códigos y luego por fin code.CodeOrder

EDIT: Explaing el uso de la tabla de códigos ...

Crear una tabla separada de Códigos (CodeId, Code, CodeOrder) y únete a esto y ordena por CodeOrder. Esto es más agradable que hacer el pedido por (caso ...) sugerido, ya que puede cambiar fácilmente los códigos y las órdenes.

+0

Creo que el punto es que el orden deseado no es el código o el orden de identificación. – cletus

+0

Estaba asumiendo que existe una tabla de códigos junto con el ID del código y el ID del pedido. – pjp

12

Puede unirse a la tabla de palabras clave e incluir una columna de secuencia y ORDER BY Keyword.Sequence.

Ejemplo su tabla de palabras clave es el siguiente:

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

A continuación, puede unirse.

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

Espero que esto te dé la idea.

3

opciones Pareja:

  1. agregar la columna ORDERCODE con numérica deseada para

  2. Añadir una tabla con FK a esta tabla ID y ORDERCODE

10

Aquí está un horrible truco :

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

Estoy de acuerdo con la parte "horrible hack" ;-) –

+1

Estoy de acuerdo :), y solo funciona con una lista estática, si se agregó otro código en algún momento en el futuro, el procedimiento de tienda tendría que ser refactorizado como bien, para acomodar este cambio. –

+0

Sí, sería un asno para mantener y no tan elegante como me gustaría, pero esto es lo que tendré que hacer. Ya he sugerido una – Tikeb

3

¿Es solo uno de ORDER BY o algo que va a querer hacer a menudo y en más valores que los especificados aquí?

El orden que ha dado es arbitraria, por lo tanto, un identificador necesario tener en cuenta para lograr lo que quiere

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 

O

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 

(no estoy familiarizado con MySQL, pero lo anterior funcionaría en SQL Server. La sintaxis para MySQL no será muy diferente)

Si es probable que quiera hacer esto a menudo , luego crea una columna OrderBy en la tabla o crea una tabla OrderBy con un enlace FK a esta tabla y especifica un campo numérico OrderBy en eso.

2

Hola esta es una consulta SQL Server, pero estoy seguro de que usted puede hacer esto en MySQL, así:

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

Hoy en día MySQL ha llamado una función find_in_set()

Úselo como este:

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