Para el registro
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
debería funcionar bien porque no tiene que ordenar la lista en la WHERE
cláusula
En cuanto a cómo funciona,
Puedes crear todo tipo de pedidos elegantes
Por ejemplo, usando la función IF ()
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
Esto hará que los primeros 4 identificadores aparezcan en la parte superior de la lista, de lo contrario, aparecerá en la parte inferior. ¿Por qué?
En el ORDER BY
, obtienes 0 o 1.
- Si la primera columna es 0, haga que aparezca cualquiera de los primeros 4 identificadores
- Si la primera columna es 1, haga que aparezca después
Volteemos con DESC en la primera columna
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
En el ORDER BY
, todavía obtienes 0 o 1.
- Si la primera columna es 1, haga que aparezcan los primeros 4 identificadores.
- Si la primera columna es 0, haga que los primeros 4 identificadores aparezcan en el orden original
TU PREGUNTA REAL
Si realmente quieres cosas internas sobre esto, ve a las páginas 189 y 192 del Libro
para una verdadera inmersión profunda.
En esencia, hay una clase de C ++ llamada ORDER *order
(El ORDER BY
árbol de expresión). En JOIN::prepare
, *order
se usa en una función llamada setup_order()
. ¿Por qué en medio de la JOIN
clase? Cada consulta, incluso una consulta en una sola tabla siempre se procesa como JOIN (consulte mi publicación ¿Existe una diferencia de ejecución entre una condición JOIN y una condición WHERE? )
El código fuente de todo esto es sql/sql_select.cc
Evidentemente, el ORDER BY
árbol va a mantener la evaluación de FIELD(id,3,2,1,4)
. Por lo tanto, los números 0,1,2,3,4 son los valores que se ordenan mientras llevan una referencia a la fila involucrada.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
luego agregueORDER BY f
oORDER BY FIELD(id,3,2,1,4)
e intente nuevamente.