Pour le compte rendu
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
devrait fonctionner aussi bien parce que vous n'avez pas à commander la liste dans la WHERE
clause
Quant à la façon dont cela fonctionne,
Vous pouvez créer toutes sortes de commandes fantaisies
Par exemple, en utilisant le IF () fonction
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);
Les 4 premiers identifiants apparaîtront en haut de la liste. Sinon, ils apparaîtront en bas. Pourquoi?
Dans le ORDER BY
, vous obtenez 0 ou 1.
- Si la première colonne est 0, indiquez l’un des 4 premiers identifiants
- Si la première colonne est 1, faites-la apparaître après
Retournons-le avec DESC dans la première colonne
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);
Dans le ORDER BY
, vous obtenez toujours 0 ou 1.
- Si la première colonne est 1, indiquez autre chose que les 4 premiers identifiants.
- Si la première colonne est 0, les 4 premiers identifiants apparaissent dans l'ordre d'origine
VOTRE QUESTION RÉELLE
Si vous voulez sérieusement des problèmes internes à ce sujet, passez aux pages 189 et 192 du livre.
pour une vraie plongée profonde.
En substance, il existe une classe C ++ appelée ORDER *order
(l' ORDER BY
arbre d'expression). Dans JOIN::prepare
, *order
est utilisé dans une fonction appelée setup_order()
. Pourquoi au milieu de la JOIN
classe? Chaque requête, même une requête sur une seule table, est toujours traitée comme une jointure (voir mon post. Existe-t-il une différence d'exécution entre une condition JOIN et une condition WHERE? )
Le code source pour tout cela est sql/sql_select.cc
Évidemment, l’ ORDER BY
arbre va contenir l’évaluation de FIELD(id,3,2,1,4)
. Ainsi, les nombres 0,1,2,3,4 sont les valeurs en train d'être triées en portant une référence à la ligne concernée.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
Ajoutez ensuiteORDER BY f
ouORDER BY FIELD(id,3,2,1,4)
et essayez à nouveau.