Cómo definir una orden ORDER BY personalizada en mySQL

En MySQL, ¿cómo puedo definir una orden de clasificación personalizada?

Para tratar de explicar lo que quiero, considere esta tabla:

ID Language Text 0 ENU a 0 JPN b 0 DAN c 1 ENU d 1 JPN e 1 DAN f 2 etc... 

aquí quiero devolver todas las filas ordenadas por Idioma y ID ascendente para que Idioma = ENU sea primero, luego JPN y finalmente DAN.

El resultado debería ser: a, d, b, e, c, f, etc.

¿Esto es posible?

MySQL tiene una función práctica llamada FIELD() que es excelente para tareas como esta.

ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

Sin embargo, tenga en cuenta que

  1. Hace que tu SQL sea menos portátil, ya que otros DBMS pueden no tener esa función

  2. Cuando su lista de idiomas (u otros valores por los que ordenar) sea mucho más larga, es mejor tener una tabla separada con la columna ordenar por ordenar para ellos y unirla a sus consultas para ordenar.

Si esos son los únicos tres valores, entonces puede usar una expresión CASE :

 ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 END 

(Si puede haber otros valores, entonces puede agregar alguna lógica extra para mantener el orden consistente, por ejemplo, puede agregar ELSE 4 a esa expresión CASE , y luego ordenar por Language como el tercer criterio de ordenamiento:

 ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 ELSE 4 END, `Language` ) 

Tienes un par de opciones de forma directa, la primera es cambiar el idioma para que sea ENUM (suponiendo que esto sea posible, y solo esperas algunas variaciones)

Si lo especifica como ENUM('ENU','JPN','DAN') entonces ORDER Language ASC ordenará en el orden que usted especifique.

El segundo implicará un caso en alguna parte, es decir,

 SELECT * FROM table ORDER BY CASE Language WHEN 'ENU' THEN 3 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 1 ELSE 0 END DESC, ID ASC 

En lo que respecta al rendimiento, el método ENUM arrojará resultados más rápidos, pero será más complicado si necesita agregar más idiomas. Una tercera opción sería agregar una tabla de normalización para los Idiomas, sin embargo, puede ser exagerado en esta instancia.