Как определить пользовательский порядок 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 приведет к более быстрым результатам, но будет более сложной, если вам нужно добавить больше языков. Третьим вариантом будет добавление таблицы нормализации для языков, однако это может быть излишним в этом случае.