W MySQL, jak zdefiniować niestandardową kolejność sortowania.
Aby spróbować wyjaśnić, czego chcę, rozważ poniższą tabelę:
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
tutaj chcę zwrócić wszystkie wiersze posortowane według języka i rosnącego identyfikatora, tak aby język = ENU był pierwszy, następnie JPN i na końcu DAN.
Wynik powinien być: a, d, b, e, c, f itd.
Czy to w ogóle możliwe?
GROUP BY
przed? Na przykład pierwsza wartość, którą chcę, pojawia się na końcu?GROUP BY
w podzapytaniu i uporządkuj je w zapytaniu zewnętrznymJeśli są to tylko trzy wartości, a następnie można użyć do
CASE
wyrażenia :(Jeśli mogą istnieć inne wartości, możesz dodać dodatkową logikę, aby zachować spójność kolejności; na przykład możesz dodać
ELSE 4
do tegoCASE
wyrażenia, a następnie ustawićLanguage
samodzielnie jako trzecie kryterium kolejności:)
źródło
Masz kilka opcji od ręki, pierwszą jest zmiana języka na ENUM (zakładając, że jest to możliwe i oczekujesz tylko kilku odmian)
Jeśli określisz to jako,
ENUM('ENU','JPN','DAN')
toORDER Language ASC
uporządkuje w określonej kolejności.Drugi będzie dotyczył sprawy gdzieś, tj
Pod względem wydajności metoda ENUM zwróci szybsze wyniki, ale będzie bardziej kłopotliwa, jeśli musisz dodać więcej języków. Trzecią opcją byłoby dodanie tabeli normalizacji dla języków, jednak w tym przypadku może to być przesada.
źródło
ENUM('ENU','JPN','DAN')
?END DESC,
byćEND CASE DESC,
?CASE
potrzebująEND CASE
, to zależy od kontekstu.CASE
w ramach PROCEDURE wymagająEND CASE
( dev.mysql.com/doc/refman/5.5/en/case.html ) jednakCASE
w ramach SELECT nie wymagaEND CASE
, po prostuEND
( dev.mysql.com/doc/refman/5.7/en/ ... ) - w tym kontekst to funkcja sterowania przepływem.W przypadku frameworka Yii2 osiągamy to poprzez podążanie drogą
źródło