Как определить пользовательский порядок ORDER BY в mySQL - PullRequest
119 голосов
/ 21 февраля 2012

В MySQL как мне определить пользовательский порядок сортировки.

Чтобы попытаться объяснить, что я хочу, рассмотрим следующую таблицу:

ID  Language    Text
0   ENU         a
0   JPN         b
0   DAN         c       
1   ENU         d
1   JPN         e
1   DAN         f
2   etc...

здесь я хочу вернуть все строки, отсортированные по языку и возрастающему идентификатору, чтобы на первом месте находился язык = ENU, затем JPN и, наконец, DAN.

Результат должен быть: a, d, b, e, c, f и т. Д.

Это вообще возможно?

Ответы [ 3 ]

243 голосов
/ 21 февраля 2012

MySQL имеет удобную функцию под названием FIELD(), которая отлично подходит для подобных задач.

ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

Обратите внимание, что

  1. Это делает ваш SQL менее переносимым, так как другие СУБД могут не иметь такой функции

  2. Когда ваш список языков (или другие значения для сортировки) становится намного длиннее, лучше иметь отдельную таблицу со столбцом сортировки для них и присоединить ее к вашим запросам для заказа.

43 голосов
/ 21 февраля 2012

Если это только три значения, вы можете использовать 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`

)

17 голосов
/ 21 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...