2009-09-03 8 views

Respuesta

20

que podría hacerlo usando FIND_IN_SET, por ejemplo,

SELECT * FROM T WHERE T.id IN(4,78,12,45) 
ORDER BY FIND_IN_SET(T.id,'4,78,12,45'); 

Si bien tiene que duplicar la lista, si está generando la consulta en código esto no es un gran problema.

+0

+1 por enseñarme sobre algo que no sabía sobre MySQL. – Welbog

+0

+1 agradable y limpio! me gusta, deseo servidor sql lo tenía. –

+0

Para casos pequeños como este, esto debería ser bastante eficiente, pero si su lista de selección es grande, me imagino que el enfoque de tabla temporal será más eficiente. –

1

En el caso general, no puede. SQL no garantiza el orden a menos que use la cláusula ORDER BY, y no puede vincularse con el contenido de una declaración IN.

Sin embargo, si puede compilar una tabla temporal que ordene los valores que está seleccionando, puede unirse a esa tabla y ordenarla.

Por ejemplo, usted tiene una tabla temporal que contiene algo como lo siguiente:

id | order 
----+------ 
4 | 1 
78 | 2 
12 | 3 
45 | 4 

A continuación, puede pedir así:

SELECT T.* 
FROM T 
INNER JOIN temp 
ON T.id = temp.id 
ORDER BY temp.order ASC 
+0

mientras me gusta la limpieza de la solución ofrecida por Paul Dixon. Esto podría ser más fácil de entender e incluso más rápido. –

0

No se puede ordenar por la cláusula IN. Debe proporcionar una cláusula ORDER BY por separado. Una forma de hacerlo es la siguiente al compilar una declaración de caso en ORDER BY. Aunque no es lindo.

SELECT 
    * 
FROM 
    T 
WHERE 
    T.Id IN(4, 78, 12, 45) 
ORDER BY 
    CASE 
     WHEN T.Id = 4 THEN 1 
     WHEN T.Id = 78 THEN 2 
     WHEN T.Id = 12 THEN 3 
     WHEN T.Id = 45 THEN 4 
    END 
Cuestiones relacionadas