MySQL – ORDER BY valores dentro de IN ()

Espero ordenar los elementos devueltos en la siguiente consulta por el orden en que se ingresaron en la función IN () .

ENTRADA:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C'); 

SALIDA:

 | id | name | ^--------^---------^ | 5 | B | | 6 | B | | 1 | D | | 15 | E | | 17 | E | | 9 | C | | 18 | C | 

¿Algunas ideas?

     SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C') ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C') 

    La función FIELD devuelve la posición de la primera cadena en la lista restante de cadenas.

    Sin embargo, es mucho mejor para el rendimiento tener una columna indexada que represente su orden de clasificación, y luego ordenar por esta columna.

    Otra opción desde aquí: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

     select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC; 

    Entonces, en su caso (no probado) sería

     SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C') ORDER BY name = 'B', name = 'A', name = 'D', name = 'E', name = 'C'; 

    Dependiendo de lo que estés haciendo, he encontrado que es un poco peculiar, pero siempre funcionó después de jugar un poco.

    Pruebe algo como

     ... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ... 

    Puede ser que esto pueda ayudar a alguien (p_CustomerId se pasa en SP):

     SELECT CompanyAccountId, CompanyName FROM account LEFT JOIN customer where CompanyAccountId = customer.AccountId GROUP BY CompanyAccountId ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId FROM customer WHERE customerid= p_CustomerId) THEN 0 ELSE 1 END, CompanyName; 

    Descripción: Quiero mostrar la lista de cuentas. Aquí estoy pasando una identificación de cliente en sp. Ahora se enumerarán los nombres de las cuentas con cuentas vinculadas a los que los clientes se muestran en la parte superior seguido por otras cuentas en orden alfabético.

    Necesita otra columna (numérica) en su tabla, en la que especifique el orden de clasificación. La cláusula IN no funciona de esta manera.

     B - 1 A - 2 D - 3 E - 4 C - 5 

    Solo usa

     order by INSTR( ',B,C,D,A,' , concat(',' , `field`, ',' ) ) 

    evitar la situación como

      INSTR('1,2,3,11' ,`field`) 

    terminará con una fila de resultados desordenada: 1 y 11 alternante