Pregunta

¿Es posible hacer una instrucción SELECT con un orden predeterminado, es decir. seleccionando los ID 7,2,5,9 y 8 y devolviéndolos en ese orden , solo por el campo de ID?

Sentencias SELECT id de FROM table WHERE id in (7,2,5,9,8); y SELECCIONE la ID DESDE la tabla DONDE la id. ambos los devuelven en el mismo orden.

¿Fue útil?

Solución

No pensé que esto fuera posible, pero encontré una entrada de blog aquí que parece para hacer el tipo de cosa que buscas:

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 da, por lo que para el primer caso anterior, id de 7 está en la posición 1 en el conjunto , 2 a 2 y así sucesivamente: mysql resuelve algo como

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

luego ordena por los resultados de FIND_IN_SET .

Otros consejos

ORDENAR POR CAMPO (ID, 7,2,4,5,8) es tu mejor apuesta, 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?

Todo el orden se realiza mediante las palabras clave ORDENAR, pero solo puede ordenar ascendente y descendente. Si está utilizando un lenguaje como PHP, puede ordenarlos de acuerdo con un 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 deba crear una tabla temporal con un campo autonumérico e insertarla en el orden deseado. Luego ordena en el nuevo campo de autonumeración.

Erm, en realidad no. Lo más cercano que puedes 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 un consejo más específico 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 here .

Obtienes respuestas rápidas por aquí, ¿no? & # 8230;

La razón por la que pregunto esto es que es la única forma en la que puedo pensar para evitar clasificar una matriz multidimensional compleja. No estoy diciendo que sería difícil de ordenar, pero si hubiera una forma más sencilla de hacerlo con sql recto, ¿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 pedido a cada ID. Funciona bien para un pequeño conjunto de valores.

Lo mejor que se me ocurre es agregar una segunda Columna orderColumn:

7 1
2 2
5 3
9 4 
8 5

Y luego simplemente haz un ORDEN POR orderColumn

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top