Per il record
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
dovrebbe funzionare anche perché non è necessario ordinare l'elenco nella WHEREclausola
Per quanto riguarda come funziona,
FIELD () è una funzione che restituisce la posizione dell'indice di un elenco delimitato da virgole se esiste il valore che stai cercando.
- IF id = 1, quindi FIELD (id, 3,2,1,4) restituisce 3 (posizione in cui 1 è nell'elenco)
- IF id = 2, quindi FIELD (id, 3,2,1,4) restituisce 2 (posizione in cui 2 è nell'elenco)
- IF id = 3, quindi FIELD (id, 3,2,1,4) restituisce 1 (posizione in cui 3 è nell'elenco)
- IF id = 4, quindi FIELD (id, 3,2,1,4) restituisce 4 (posizione in cui 4 è nell'elenco)
- IF id = qualcos'altro, quindi FIELD (id, 3,2,1,4) restituisce 0 (non nell'elenco)
I ORDER BYvalori vengono valutati in base a ciò che restituisce FIELD ()
Puoi creare tutti i tipi di ordini fantasiosi
Ad esempio, utilizzando la funzione 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);
Questo farà apparire i primi 4 ID in cima all'elenco, altrimenti apparirà in fondo. Perché?
In ORDER BY, ottieni 0 o 1.
- Se la prima colonna è 0, fai apparire uno dei primi 4 ID
- Se la prima colonna è 1, farla apparire in seguito
Capovolgilo con DESC nella prima colonna
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);
In ORDER BY, ottieni ancora 0 o 1.
- Se la prima colonna è 1, fai apparire solo i primi 4 ID.
- Se la prima colonna è 0, fai apparire i primi 4 ID nell'ordine originale
LA TUA DOMANDA ATTUALE
Se vuoi davvero degli interni su questo, vai alle pagine 189 e 192 del libro

per un'immersione profonda.
In sostanza, esiste una classe C ++ chiamata ORDER *order(L' ORDER BYalbero delle espressioni). In JOIN::prepare, *orderviene utilizzato in una funzione chiamata setup_order(). Perché nel mezzo della JOINclasse? Ogni query, anche una query su una singola tabella, viene sempre elaborata come JOIN (Vedi il mio post Esiste una differenza di esecuzione tra una condizione JOIN e una condizione WHERE? )
Il codice sorgente per tutto questo è sql/sql_select.cc
Evidentemente, l' ORDER BYalbero terrà la valutazione di FIELD(id,3,2,1,4). Pertanto, i numeri 0,1,2,3,4 sono i valori ordinati mentre si porta un riferimento alla riga interessata.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);quindi aggiungiORDER BY foORDER BY FIELD(id,3,2,1,4)e riprova.