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 WHERE
clausola
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 BY
valori 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 BY
albero delle espressioni). In JOIN::prepare
, *order
viene utilizzato in una funzione chiamata setup_order()
. Perché nel mezzo della JOIN
classe? 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 BY
albero 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 f
oORDER BY FIELD(id,3,2,1,4)
e riprova.