2012-06-07 16 views
25

Voy a tener una lista fija de artículos para ordenar por la que no sabré hasta que ejecute la consulta ya que hay un paso de aleatorización.mysql ordenar por una lista fija

me gustaría tener algo como lo siguiente:

suponer que is_launch_set volverá 1,3,7,11 pero han sido asignados al azar a continuación:

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

alguna idea sobre cómo lograr ¿esta? Estaba pensando en find_in_set pero no estoy seguro.

+0

Duplicar posibles: [MySQL Ordenar por alguna lista] (http: // stackoverflow .com/questions/6810793 /), aunque esta atrajo una respuesta más completa. –

Respuesta

55

Puede hacerlo utilizando cualquiera:

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

¿Estás seguro de que el hallazgo en el conjunto funcionaría? Antes de formular la pregunta, pensé que sería la respuesta, pero el orden parece diferente cada vez. ¿Hay alguna configuración o algo más? La respuesta de campo se ve bien. – timpone

+0

@timpone: estoy seguro de que funciona. Puede poner 'FIND_IN_SET (id, '3,11,7,1')' en 'SELECT' para asegurarse de que devuelve lo que se esperaba – zerkms

+1

¿Tiene alguna información sobre cuál de estos enfoques es el que se realiza más rápido? ¿Hay algo que uno pueda hacer para acelerarlo además de poner un índice en el campo 'id'? –