2010-09-26 23 views

Respuesta

77

Debe usar "ORDER BY FIELD". Así, por ejemplo:

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
ORDER BY FIELD(id,118,17,113,23,72) 
+0

¡Gracias! ¡Esto funciona! – kentor

+0

@kentor: no hay problema, me alegro de que haya ayudado – nico

+1

¿Qué tal el rendimiento? ¿Es lento cuando se vuelve a especificar la misma lista de identificación? – Emerald214

11

Intente utilizar FIND_IN_SET:

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
    ORDER BY FIND_IN_SET(id, '118,17,113,23,72'); 
+0

+1: Que iba a ser mi recomendación –

+3

¿Cómo '' find_in_set' comparar a field'? – ShiningRay

+2

@ShiningRay Del manual parece que el 'FIELD' es un método directo y' FIND_IN_SET' es más poderoso y complejo que involucra el análisis sintáctico de cadenas y la creación 'SET'. – Igor

0

Una opción es utilizar UNION:

SELECT * FROM table WHERE id = 118 
UNION 
SELECT * FROM table WHERE id = 17 
UNION 
SELECT * FROM table WHERE id = 113 
... 
+0

O 'UNION ALL' si está recuperando filas que podrían ser duplicados entre sí. En mi código, parece que esto podría ser bastante lento. –

0

Se puede crear un número para ordenar en base a los valores de ID:

select * 
from table 
where id in (118,17,113,23,72) 
order by 
    case id 
    when 118 then 1 
    when 17 then 2 
    when 133 then 3 
    when 23 then 4 
    when 72 then 5 
    end 
0

esto es lo primero que se le viene a la mente. Nota SQL no se ha probado, puede que tenga que comprobar la sintaxis correcta

es un poco engorroso, pero puede hacer el truco

select * from table where id = 118 
union 
select * from table where id = 17 
union 
.... and so on 
0

Creo que si se hizo una consulta UNION con cada uno seleccione, puede devolverlo en el orden.

SELECT * FROM table WHERE id=118 
UNION 
SELECT * FROM table WHERE id=17 
... 

Ugly, pero creo que funcionará.

2

Se puede crear una tabla temporal con dos columnas (ID, order_num):

ID order_num 
118 1 
17 2 
113 3 
23 4 
72 5 

Luego de Ingreso:

SELECT * from table 
INNER JOIN #temp_table 
ON table.id = #temp_table.id 

en cuenta que se puede eliminar la cláusula IN.

A veces realmente creo una tabla permanente, porque cuando el cliente inevitablemente cambia de opinión sobre el pedido, no tengo que tocar el código, solo la tabla.

Editar

La respuesta utilizando ORDER BY FIELD() (que yo no sabía nada) es probablemente lo que quiere.

+1

+1 Para el comentario "inevitablemente" (y totalmente cierto). – Julian

Cuestiones relacionadas