una tipos ocultar excluir ejemplos consultas consulta columna campo mysql sql-order-by

mysql - tipos - Devolver los resultados de la consulta en orden predefinida



select mysql ejemplos (11)

¿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?

¿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.


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í .


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


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


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


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.


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?


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.


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.