Я надеюсь отсортировать элементы, возвращенные в следующем запросе, по в порядке их ввода в функцию 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 |
Есть идеи?
SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C') ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
Функция FIELD возвращает позицию первой строки в оставшемся списке строк.
Однако с точки зрения производительности гораздо лучше иметь индексированный столбец, представляющий порядок сортировки, а затем сортировать по этому столбцу.
Другой вариант здесь: 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';
В зависимости от того, что вы делаете, я нахожу это немного странным, но всегда заставляю его работать, немного поиграв с ним.
Может быть, это может кому-то помочь (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. Теперь в нем будут перечислены имена учетных записей, учетные записи которых связаны с тем, что клиенты отображаются вверху, а затем другие учетные записи в алфавитном порядке.
Попробуйте что-то вроде
... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
Вам нужен еще один столбец (числовой) в таблице, в котором вы указываете порядок сортировки. Предложение IN не работает таким образом.
B - 1 A - 2 D - 3 E - 4 C - 5
просто используйте
order by INSTR( ',B,C,D,A,' , concat(',' , `field`, ',' ) )
избегайте ситуации, подобной
INSTR('1,2,3,11' ,`field`)
закончится неупорядоченной строкой результатов: 1 и 11 поочередно