Как определить пользовательский порядок ORDER BY в mySQL
В MySQL как определить пользовательский порядок сортировки.
Чтобы попытаться объяснить, что я хочу, рассмотрим эту таблицу:
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
здесь я хочу вернуть все строки, отсортированные по языку и восходящему ID, чтобы сначала появился язык = ENU, затем JPN и, наконец, DAN.
Результат должен быть: a, d, b, e, c, f и т.д.
Возможно ли это?
Ответы
Ответ 1
MySQL имеет удобную функцию под названием FIELD()
, которая отлично подходит для таких задач.
ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID
Обратите внимание, что
-
Это делает ваш SQL менее переносимым, поскольку другие СУБД могут не иметь такой функции
-
Когда ваш список языков (или других значений для сортировки) становится намного длиннее, лучше иметь отдельную таблицу с столбцом sortorder для них и присоединяться к ней для ваших запросов для заказа.
Ответ 2
Если это единственные три значения, вы можете использовать выражение a 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`
)
Ответ 3
У вас есть пара опций, прежде всего, чтобы изменить язык на 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 приведет к более быстрым результатам, но будет более сложной, если вам нужно добавить больше языков. Третьим вариантом будет добавление таблицы нормализации для языков, однако это может быть излишним в этом случае.