mysql ordinamento personalizzato

Ho una query come questa: SELECT * FROM table WHERE id IN (2,4,1,5,3);

Tuttavia, quando lo stampo, viene automaticamente ordinato 1,2,3,4,5. Come possiamo mantenere l’ordine (2,4,1,5,3) senza modificare la struttura del database?

Grazie!

chiedo questo:

mysql ordina per problema

le risposte che ottengo e tutto il merito è di loro è:

È ansible utilizzare un operatore CASE per specificare l’ordine:

 SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY CASE id WHEN 3 THEN 1 WHEN 6 THEN 2 WHEN 1 THEN 3 WHEN 8 THEN 4 WHEN 9 THEN 5 END 

in php puoi farlo come:

  $v){ $sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n"; } $sql .= 'END '; echo $sql; ?> 
 SELECT * FROM table WHERE id IN (2,4,1,5,3) ORDER BY FIELD(id,2,4,1,5,3); 

Fonte: http://imthi.com/blog/programming/mysql-order-by-field-custom-field-sorting.php

(Avrei scritto questo come commento sulla risposta di Michel Tobon, ma non ho la reputazione, mi dispiace 🙂

“E ha funzionato … perché? Mi batte, ma lo ha fatto, prova anche tu.”

La ragione per cui funziona è perché la tua espressione “code! = ‘USA'” sta producendo un risultato booleano, che in SQL è rappresentato come 1 o 0. Quindi, l’espressione “code = ‘USA’ produce un 1 per ogni record che corrisponde a quel criterio e uno 0 per ogni record che non lo fa.Perché 1 è successivo a 0 in un ordinamento crescente (predefinito), i record corrispondenti verranno ordinati più tardi di quelli non corrispondenti. In tal modo si nega quell’espressione producendo l’effetto opposto.

Un altro (possibilmente più chiaro) modo di produrre lo stesso risultato sarebbe il seguente:

 SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC 

Naturalmente, rispondendo alla domanda dell’OP, mi piace l’opzione FIELD () meglio – abbastanza pulita 🙂

L’ordine per campo non ha mai funzionato per me. Avevo una lista di paesi e avevo bisogno che Stati Uniti e Canada comparissero in cima alla lista, quindi la mia richiesta era la seguente:

 SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC 

Questo non ha mai funzionato, ma ho capito che l’ordine era diverso, mostrava il Canada e gli Stati alla fine della lista, quindi ho fatto questo:

 SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC 

E ha funzionato … perché? Mi batte, ma lo ha fatto; provalo pure.