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 BY
antes? Por ejemplo, el primer valor que quiero aparece al final.GROUP BY
en una subconsulta ySi esos son los únicos tres valores, puede usar una
CASE
expresió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 4
a esaCASE
expresión y luego ordenar porLanguage
sí 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 ASC
ordenará 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,
?CASE
necesarioEND CASE
, depende del contexto.CASE
dentro de PROCEDIMIENTO requiereEND CASE
( dev.mysql.com/doc/refman/5.5/en/case.html ) sin embargo,CASE
dentro 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