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