2012-06-07 21 views
25

Ho intenzione di avere una lista fissa di articoli da ordinare che non saprò fino a quando non eseguirò la query poiché c'è un passaggio di randomizzazione.ordine mysql da una lista fissa

Mi piacerebbe avere qualcosa di simile al seguente:

supporre che is_launch_set tornerà 1,3,7,11 ma sono stati randomizzati al di sotto:

select * from items where is_launch_set=1 order by id values (3,11,7,1); 

tutte le idee su come realizzare Questo? Stavo pensando forse a find_in_set ma non sono proprio sicuro.

+0

Eventuali duplicati: [MySQL Ordina per qualche lista] (http: // StackOverflow .com/questions/6810793 /), anche se questo ha attirato una risposta più approfondita. –

risposta

55

Puoi farlo utilizzando uno:

ORDER BY FIND_IN_SET(id, '3,11,7,1') 

o

ORDER BY FIELD(id, 3, 11, 7, 1) 

o

ORDER BY CASE id WHEN 3 THEN 0 
       WHEN 11 THEN 1 
       WHEN 7 THEN 2 
       WHEN 1 THEN 3 
         ELSE 4 
     END 
+1

sei sicuro che la ricerca nel set funzionerebbe - prima di chiederlo al quesiton, è quello che pensavo sarebbe stata la risposta, ma l'ordine sembra diverso ogni volta. Ci sono delle impostazioni di configurazione o qualsiasi altra cosa. La risposta sul campo sembra buona. – timpone

+0

@timpone: sono sicuro che funzioni. Puoi mettere 'FIND_IN_SET (id, '3,11,7,1')' su 'SELECT' per assicurarti che restituisca quanto atteso – zerkms

+1

Hai qualche informazione su quale di questi approcci è il più veloce? C'è qualcosa che si può fare per velocizzarlo oltre a mettere un indice sul campo 'id'? –