2010-06-02 11 views
8

Esiste un modo semplice per ordinare i risultati MySQL rispettivamente da WHERE id IN (...) clausola? Esempio:MySQL che specifica l'ordine esatto con WHERE `id` IN (...)

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3) 

per tornare

Article with id = 4 
Article with id = 2 
Article with id = 5 
Article with id = 9 
Article with id = 3 

e anche

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3) LIMIT 2,2 

per tornare

Article with id = 5 
Article with id = 9 

Update: per essere più precisi, voglio evitare la manomissione i dati in p arenthes in WHERE articles.id IN (4, 2, 5, 9, 3), poiché questi ID sono dinamici e ordinati automaticamente.

risposta

14

Sì, un po ':

SELECT * FROM articles 
WHERE articles.id IN (4, 2, 5, 9, 3) 
ORDER BY FIND_IN_SET(articles.id, '4,2,5,9,3') 

ma questo è SQL non standard e gli odori un po'.

+4

+1 per soluzione pragmatica. E per la parte "odori un po '". ;) – Tomalak

+0

I risultati sono esattamente ciò che stavo cercando, molte grazie. –

0

Non penso che tu possa farlo. Non c'è nessun ordine "esplicito" in corso; la frase "in" ti dice semplicemente cosa recuperare e non ha informazioni sull'ordinazione.

Poiché gli esempi che hai fornito non hanno un ordine evidente, la soluzione migliore è gestirla nel codice dopo che il risultato è stato restituito.

1

MySQL ordina solo con ORDER BY. Questo è il motivo per cui non è molto raro che le tabelle del database abbiano qualcosa come una colonna di ordinalità.

articles 
+----+------------+-------+ 
| id | ordinality | (...) | 
+----+------------+-------+ 
| 2 |   2 | '' | 
| 3 |   5 | '' | 
| 4 |   1 | '' | 
| 5 |   3 | '' | 
| 9 |   4 | '' | 
+----+------------+-------+ 

SELECT * 
    FROM articles 
WHERE articles.id IN (4, 2, 5, 9, 3) 
ORDER BY articles.ordinality 
3

questo funziona per me: ORDER BY CAMPO (Product.id, 4,9,8,5,3,11,24,16)

+0

Funzionano entrambi ed è in realtà più veloce della risposta accettata, sulla mia macchina comunque. Ho testato 1000 record e 'find_in_set' ha impiegato 0.03 secondi e' field' ha impiegato 0.02 secondi. Suppongo che questa differenza diventerebbe più marcata con insiemi più grandi. Ho anche provato con una clausola "LIMIT 2" e "find_in_set" ha richiesto più tempo, 0,04 sec, mentre "field" richiedeva ancora 0,02 secondi. Personalmente penso che 0.02sec sia ancora piuttosto lento. L'OP dovrebbe fare attenzione a non passare in serie di dati di grandi dimensioni o prenderà un successo in termini di prestazioni! – Coder