MySQL - значения ORDER BY внутри IN()

Я надеюсь отсортировать элементы, возвращенные в следующем запросе, с помощью порядка, который они введены в функцию IN().

INPUT:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

ВЫВОД:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

Любые идеи?

Ответ 1

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

Функция FIELD возвращает позицию первой строки в оставшемся списке строк.

Однако гораздо лучше иметь индексный столбец, который представляет ваш порядок сортировки, а затем сортировать по этому столбцу.

Ответ 2

Другой вариант отсюда: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;

Итак, в вашем случае (untested) будет

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';

В зависимости от того, что вы делаете, я нашел это немного причудливым, но всегда работал, чтобы немного поиграть с ним.

Ответ 3

Попробуйте что-нибудь вроде

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...

Ответ 4

Может быть, это может помочь кому-то (p_CustomerId передается в SP):

SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;

Описание: Я хочу показать список учетных записей. Здесь я передаю идентификатор клиента в sp. Теперь он будет перечислять имена учетных записей с учетными записями, связанными с тем, что клиенты отображаются сверху, а затем другие учетные записи в алфавитном порядке.

Ответ 5

Вам нужен другой столбец (числовой) в вашей таблице, в котором вы указываете порядок сортировки. Предложение IN не работает таким образом.

B - 1
A - 2
D - 3
E - 4
C - 5

Ответ 6

просто используйте

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

избегайте ситуации вроде

 INSTR('1,2,3,11' ,`field`) 

закончится с неупорядоченной строкой результата: 1 и 11 alternant