MySQL - значения ORDER BY в IN () - PullRequest
97 голосов
/ 06 июня 2009

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

ВХОД:

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     |

Есть идеи?

Ответы [ 6 ]

205 голосов
/ 06 июня 2009
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

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

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

27 голосов
/ 06 июня 2009

Другой вариант здесь: 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;

Так что в вашем случае (не проверено) будет

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 голосов
/ 07 сентября 2011

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

3 голосов
/ 06 июня 2009

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

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
2 голосов
/ 06 июня 2009

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

B - 1
A - 2
D - 3
E - 4
C - 5
0 голосов
/ 14 ноября 2017

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

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

избегайте ситуации, подобной

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

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

...