En MySQL, ¿cómo defino un orden de clasificación personalizado?
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 e ID ascendente para que Language = ENU aparezca primero, luego JPN y finalmente DAN.
El resultado debería ser: a, d, b, e, c, f etc.
¿Es esto posible?

GROUP BYantes? Por ejemplo, el primer valor que quiero aparece al final.GROUP BYen una subconsulta ySi esos son los únicos tres valores, puede usar una
CASEexpresión :(Si puede haber otros valores, puede que desee agregar un poco de lógica adicional para mantener el orden consistente; por ejemplo, puede agregar
ELSE 4a esaCASEexpresión y luego ordenar porLanguagesí mismo como el tercer criterio de orden:)
fuente
Tiene un par de opciones de antemano, la primera es cambiar el idioma para que sea ENUM (suponiendo que esto sea posible, y solo espera algunas variaciones)
Si especifica como
ENUM('ENU','JPN','DAN')seORDER Language ASCordenará en el orden que especifique.El segundo involucrará un caso en algún lugar, es decir
En cuanto 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 excesivo en este caso.
fuente
ENUM('ENU','JPN','DAN')?END DESC,serEND CASE DESC,?CASEnecesarioEND CASE, depende del contexto.CASEdentro de PROCEDIMIENTO requiereEND CASE( dev.mysql.com/doc/refman/5.5/en/case.html ) sin embargo,CASEdentro de SELECCIONAR no requiereEND CASE, simplementeEND( dev.mysql.com/doc/refman/5.7/en/… ) - en este contexto es una función de control de flujo.Para el marco Yii2 podemos lograrlo de la siguiente manera
fuente