Para o registro
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
deve funcionar também porque você não precisa solicitar a lista na WHERE
cláusula
Quanto à forma como funciona,
Você pode criar todos os tipos de pedidos sofisticados
Por exemplo, usando a função 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);
Isso fará com que os 4 primeiros IDs apareçam no topo da lista. Caso contrário, ele aparecerá na parte inferior. Por quê?
No ORDER BY
, você recebe 0 ou 1.
- Se a primeira coluna for 0, faça com que qualquer um dos 4 primeiros IDs apareça
- Se a primeira coluna for 1, faça com que apareça depois
Vamos virar com DESC na primeira coluna
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);
No ORDER BY
, você ainda recebe 0 ou 1.
- Se a primeira coluna for 1, faça com que tudo, menos os 4 primeiros IDs, apareçam.
- Se a primeira coluna for 0, faça com que os 4 primeiros IDs apareçam na ordem original
SUA PERGUNTA REAL
Se você realmente quer informações internas sobre isso, vá para as páginas 189 e 192 do Livro.
para um mergulho profundo.
Em essência, há uma classe C ++ chamada ORDER *order
(A ORDER BY
árvore de expressão). In JOIN::prepare
, *order
é usado em uma função chamada setup_order()
. Por que no meio da JOIN
aula? Cada consulta, até mesmo uma consulta contra uma única tabela é sempre processado como um join (Veja meu post Existe uma diferença entre a execução de uma condição de junção e uma condição em que? )
O código fonte para tudo isso é sql/sql_select.cc
Evidentemente, a ORDER BY
árvore vai realizar a avaliação de FIELD(id,3,2,1,4)
. Assim, os números 0,1,2,3,4 são os valores que estão sendo classificados enquanto carrega uma referência para a linha envolvida.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
adicioneORDER BY f
ouORDER BY FIELD(id,3,2,1,4)
tente novamente.