Как в MySQL определить собственный порядок сортировки.
Чтобы попытаться объяснить, что я хочу, рассмотрим эту таблицу:
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
здесь я хочу вернуть все строки, отсортированные по языку и идентификатору по возрастанию, чтобы сначала было Language = ENU, затем JPN и, наконец, DAN.
Результат должен быть: a, d, b, e, c, f и т. Д.
Это вообще возможно?
GROUP BY
раньше? Например, первое значение, которое я хочу, отображается в конце?GROUP BY
в подзапрос и упорядочите его во внешнем запросеЕсли только эти три значения, то вы можете использовать в
CASE
выражение :ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 END
(Если могут быть другие значения, вы можете добавить некоторую дополнительную логику, чтобы упорядочить порядок; например, вы можете добавить
ELSE 4
к этомуCASE
выражению, а затем упорядочить егоLanguage
как третий критерий упорядочения:ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 ELSE 4 END, `Language`
)
источник
У вас есть несколько вариантов, во-первых, изменить Language на ENUM (при условии, что это возможно, и вы ожидаете только несколько вариантов)
Если вы укажете это как,
ENUM('ENU','JPN','DAN')
тоORDER Language ASC
будет заказывать в указанном вами порядке.Второй будет связан с чем-то, т.е.
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
С точки зрения производительности метод ENUM будет возвращать более быстрые результаты, но доставит больше хлопот, если вам нужно добавить больше языков. Третий вариант - добавить таблицу нормализации для языков, однако в данном случае это может оказаться излишним.
источник
ENUM('ENU','JPN','DAN')
?END DESC,
бытьEND CASE DESC,
?CASE
нужноEND CASE
, это зависит от контекста.CASE
в ПРОЦЕДУРЕ требуетсяEND CASE
( dev.mysql.com/doc/refman/5.5/en/case.html ), однакоCASE
в SELECT не требуетсяEND CASE
, простоEND
( dev.mysql.com/doc/refman/5.7/en/… ) - в этом контекст это функция потока управления.Для структуры Yii2 мы можем добиться следующего:
источник