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.