SQL Упорядочить по списку строк? - PullRequest
25 голосов
/ 07 августа 2009

Я хочу сделать выбор в таблице и упорядочить результаты по определенному ключевому слову или списку ключевых слов. Например, у меня есть таблица, например, так:

ID  Code
1   Health
2   Freeze
3   Phone
4   Phone
5   Health
6   Hot

так что вместо простого Order By asc/desc я бы хотел order by Health, Phone, Freeze, Hot. Это возможно?

Ответы [ 8 ]

49 голосов
/ 10 августа 2009

Попробуйте использовать это:

select * from table 
order by FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot')
12 голосов
/ 07 августа 2009

Вы можете объединиться с таблицей Ключевые слова и включить столбец последовательности и ORDER BY Keyword.Sequence.

Пример таблицы ключевых слов выглядит следующим образом:

ID  Code     Sequence
1   Health   1 
2   Freeze   3
3   Phone    2
4   Hot      4

Тогда вы можете присоединиться.

SELECT *
FROM   MyTable INNER JOIN
          Keywords ON Keywords.ID = MyTable.KeywordID
ORDER BY Keywords.Sequence

Надеюсь, что это дает вам идею.

11 голосов
/ 07 августа 2009

Вот ужасный хак:

select * from table
order by (
     case Code 
     when 'Health' then 0 
     when 'Phone' then 1
     when 'Freeze' then 2
     when 'Hot' then 3
     end
)
4 голосов
/ 01 июля 2011

В настоящее время MySQL имеет функцию с именем find_in_set()

Используйте это так:

select * from table 
order by find_in_set(Code,'Health','Phone','Freeze','Hot')
3 голосов
/ 07 августа 2009

Привет, это запрос SQL Server, но я уверен, что вы можете сделать это и в MySQL:

SELECT ID,  Code
FROM x
ORDER BY 
     CASE Code WHEN 'Health' THEN 1
               WHEN 'Phone' THEN 2
               WHEN 'Freeze' THEN 4
               WHEN 'Hot' THEN 5
     ELSE 6 END ASC
     , Code ASC
3 голосов
/ 07 августа 2009

Это просто один раз ORDER BY или что-то, что вы захотите делать часто и с большим количеством значений, чем указано здесь?

Порядок, который вы указали, является произвольным, поэтому для достижения того, что вы хотите, необходимо указать идентификатор

SELECT 
    ID,
    Code,
    CASE Code
        WHEN 'Health' THEN 1
        WHEN 'Phone' THEN 2
        WHEN 'Freeze' THEN 3
        WHEN 'Hot' THEN 4
    END As OrderBy
FROM Table
ORDER BY 
    OrderBy

Или

SELECT 
    ID,
    Code
FROM Table
ORDER BY 
    CASE Code
        WHEN 'Health' THEN 1
        WHEN 'Phone' THEN 2
        WHEN 'Freeze' THEN 3
        WHEN 'Hot' THEN 4
    END

(Я не знаком с MySQL, но вышеперечисленное будет работать в SQL Server. Синтаксис MySQL не будет слишком отличаться)

Если вы, вероятно, захотите делать это часто, то создайте столбец OrderBy на таблице или таблицу OrderBy со ссылкой FK на эту таблицу и укажите в ней числовое поле OrderBy.

3 голосов
/ 07 августа 2009

Пара вариантов:

  1. Добавить столбец OrderCode с числовым желаемый заказ

  2. Добавить таблицу с FK к этому идентификатору таблицы и код заказа

1 голос
/ 07 августа 2009

Да, присоедините свои результаты к вашей кодовой таблице , а затем закажите по code.CodeOrder

РЕДАКТИРОВАТЬ: Объясняя использование таблицы кодов ...

Создайте отдельную таблицу кодов (CodeId, Code, CodeOrder) и присоединитесь к ней и сделайте заказ по CodeOrder. Это приятнее, чем делать заказ с помощью (case ...) предложенного хака, поскольку вы можете легко изменить коды и заказы.

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