No MySQL, como defino uma ordem de classificação personalizada.
Para tentar explicar o que eu quero, considere esta tabela:
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
aqui eu quero retornar todas as linhas classificadas por Idioma e ID crescente, para que Idioma = ENU seja o primeiro, depois o JPN e, por fim, a DAN.
O resultado deve ser: a, d, b, e, c, f etc.
Isso é possível?
GROUP BY
antes? Por exemplo, o primeiro valor que eu quero, aparece no final?GROUP BY
em uma subconsulta e solicite-a na consulta externaSe esses são os únicos três valores, você pode usar uma
CASE
expressão :(Se houver outros valores, convém adicionar alguma lógica extra para manter a ordem consistente; por exemplo, você poderá adicionar
ELSE 4
essaCASE
expressão e, em seguida, ordenar porLanguage
si só como o terceiro critério de ordem:)
fonte
Você tem algumas opções de antemão, a primeira é mudar o idioma para ENUM (supondo que isso seja possível e você só espera algumas variações)
Se você especificá-lo como
ENUM('ENU','JPN','DAN')
, em seguida,ORDER Language ASC
irá pedir na ordem que você especificar.O segundo envolverá um caso em algum lugar, ou seja,
Em termos de desempenho, o método ENUM retornará resultados mais rápidos, mas terá mais problemas se você precisar adicionar mais idiomas. Uma terceira opção seria adicionar uma tabela de normalização para os idiomas, mas isso pode ser um exagero nesse caso.
fonte
ENUM('ENU','JPN','DAN')
?END DESC,
serEND CASE DESC,
?CASE
necessidadesEND CASE
, dependem do contexto.CASE
dentro de PROCEDURE requireEND CASE
( dev.mysql.com/doc/refman/5.5/en/case.html ), porémCASE
no SELECT não é necessárioEND CASE
, simplesmenteEND
( dev.mysql.com/doc/refman/5.7/en/… ) - neste contexto, é uma função de controle de fluxo.Para a estrutura Yii2, conseguimos alcançar da seguinte maneira
fonte