Saltar al contenido

¿Cómo funciona ORDER BY FIELD() en MySQL internamente?

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 BYobtienes 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 BYtodaví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.

Interiores de MySQL

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *