2008-09-25 24 views
14

¿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.Devolver los resultados de la consulta en orden predefinida

Declaraciones SELECCIONE id DE LA tabla DONDE 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.

+0

El título de esta pregunta no está claro. Edítelo para que las personas que pasan de una pregunta a otra puedan entenderlo. –

Respuesta

34

no creía que esto era posible, pero encontré un blog entry here que parece hacer el tipo de cosas que está 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á resultados diferentes 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 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 funciona internamente como

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

luego ordena por los resultados de FIND_IN_SET.

+0

Suponiendo que funcione, es una solución realmente agradable. – JosephStyons

+0

¡Probado en v5 aquí, y funciona bien! El blog vinculado anteriormente menciona un conjunto más complicado de consultas donde puede ser incluso más útil – ConroyP

+0

Funciona, y es increíble. :-) – ceejayoz

0

Todo el pedido se realiza mediante las palabras clave ORDEN POR, pero solo se puede ordenar de forma 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.

0

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 
1

Podría incluir una expresión case que mapea sus identificaciones 7,2,5, ... para los ordinales 1,2,3, ... y luego por fin esa expresión?

0

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

0

Es hacky (y probablemente lento), pero se puede conseguir 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 han mencionado la función FIND_IN_SET que se documenta here.

-1

mejor que se me ocurre es la adición de un segundo orderColumn Columna:

7 1 
2 2 
5 3 
9 4 
8 5 

Y luego simplemente hacer un ORDER BY orderColumn

0

Ehh, no realmente. Cercano que puede llegar es probablemente:

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

Pero es probable que no quieren que :)

Es difícil darle algún consejo más específico sin más información acerca de lo que hay en las tablas.

2

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

0

para contestarle rápidamente por aquí, ¿no es así ...

La razón por la que estoy pidiendo es que esta es la única manera que se me ocurre para evitar la clasificación de 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?

0

Una solución 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.

Cuestiones relacionadas