Si encuentras algún fallo en tu código o trabajo, recuerda probar siempre en un entorno de testing antes subir el código al trabajo final.
Solución:
Para el registro
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
debería funcionar también porque no tiene que ordenar la lista en el WHERE
cláusula
En cuanto a cómo funciona,
-
CAMPO() es una función que devuelve la posición del índice de una lista delimitada por comas si existe el valor que está buscando.
- SI id = 1, entonces CAMPO (id, 3,2,1,4) devuelve 3 (posición donde 1 está en la lista)
- SI id = 2, entonces CAMPO (id, 3,2,1,4) devuelve 2 (posición donde 2 está en la lista)
- SI id = 3, entonces CAMPO (id, 3,2,1,4) devuelve 1 (posición donde 3 está en la lista)
- SI id = 4, entonces CAMPO (id, 3,2,1,4) devuelve 4 (posición donde 4 está en la lista)
- IF id = cualquier otra cosa, entonces CAMPO (id, 3,2,1,4) devuelve 0 (no en la lista)
-
los
ORDER BY
los valores son evaluados por lo que CAMPO() devoluciones
Puedes crear todo tipo de pedidos elegantes.
Por ejemplo, usando el SI() función
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 ID 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, haz que aparezca cualquiera de los primeros 4 id.
- Si la primera columna es 1, haz 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 aparezca cualquier cosa menos los primeros 4 ID.
- Si la primera columna es 0, haga que los primeros 4 ID aparezcan en el orden original
SU PREGUNTA REAL
Si en serio quieres información interna 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
(Los ORDER BY
árbol de expresiones). En JOIN::prepare
, *order
se utiliza 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 ¿Hay alguna 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 celebrar 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.