Devolver los resultados de la consulta en orden predefinida

¿Es posible hacer una instrucción SELECT con un orden predeterminado, es decir. seleccionando las ID 7,2,5,9 y 8 y devolviéndolas en ese orden , basándose en nada más que el campo ID.

Declaraciones SELECCIONE la ID FROM tabla WHERE id en (7,2,5,9,8); y SELECCIONE la ID FROM tabla WHERE id en (8,2,5,9,7); ambos los devuelven en el mismo orden.

No creí que esto fuera posible, pero encontré una entrada de blog aquí que parece hacer el tipo de cosas que estás buscando:

SELECT id FROM table WHERE id in (7,2,5,9,8) ORDER BY FIND_IN_SET(id,"7,2,5,9,8"); 

dará diferentes resultados a

 SELECT id FROM table WHERE id in (7,2,5,9,8) ORDER BY FIND_IN_SET(id,"8,2,5,9,7"); 

FIND_IN_SET devuelve la posición de id en el segundo argumento que se le asigna, por lo que para el primer caso anterior, id de 7 está en la posición 1 en el conjunto, 2 en 2 y así sucesivamente – mysql internamente funciona algo así como

 id | FIND_IN_SET ---|----------- 7 | 1 2 | 2 5 | 3 

luego ordena por los resultados de FIND_IN_SET .

ORDER BY FIELD (ID, 7,2,4,5,8) es tu mejor opción, pero sigue siendo feo.

¿Podría incluir una expresión de caso que asigne sus ID 7,2,5, … a los ordinales 1,2,3, … y luego ordenar por esa expresión?

Todos los pedidos se realizan con las palabras clave ORDER BY, pero solo puede ordenar ascendente y descendente. Si está utilizando un lenguaje como PHP, puede ordenarlos en consecuencia usando algún código, pero no creo que sea posible solo con MySQL.

Esto funciona en Oracle. ¿Puedes hacer algo similar en MySql?

 SELECT ID_FIELD FROM SOME_TABLE WHERE ID_FIELD IN(11,10,14,12,13) ORDER BY CASE WHEN ID_FIELD = 11 THEN 0 WHEN ID_FIELD = 10 THEN 1 WHEN ID_FIELD = 14 THEN 2 WHEN ID_FIELD = 12 THEN 3 WHEN ID_FIELD = 13 THEN 4 END 

Es posible que necesite crear una tabla temporal con un campo de autonumeración e insertarla en el orden deseado. Luego ordena en el nuevo campo de autonumeración.

Erm, no realmente. Lo más cerca que puede obtener es probablemente:

 SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3 

Pero probablemente no quieras eso 🙂

Es difícil darle más consejos específicos sin más información sobre lo que hay en las tablas.

Es hacky (y probablemente lento), pero puedes obtener el efecto con UNION ALL:

 SELECT id FROM table WHERE id = 7 UNION ALL SELECT id FROM table WHERE id = 2 UNION ALL SELECT id FROM table WHERE id = 5 UNION ALL SELECT id FROM table WHERE id = 9 UNION ALL SELECT id FROM table WHERE id = 8; 

Editar: Otras personas mencionaron la función find_in_set que está documentada aquí .

Obtienes respuestas rápidas por aquí, ¿no? …

La razón por la que estoy preguntando esto es porque es la única forma en que puedo pensar para evitar clasificar una matriz multidimensional compleja. No digo que sea difícil de clasificar, pero si hubiera una forma más sencilla de hacerlo con SQL directo, ¿por qué no?

Una solución de Oracle es:

 SELECT id FROM table WHERE id in (7,2,5,9,8) ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6); 

Esto asigna un número de orden a cada ID. Funciona bien para un pequeño conjunto de valores.

Lo mejor que puedo pensar es agregar un segundo Column orderColumn:

 7 1 2 2 5 3 9 4 8 5 

Y luego solo haz una ORDEN POR ordenColumna