mysql SQL: определенный элемент должен быть первым, а затем отсортировать остальные элементы
допустим у меня в таблице ниже.
Я хочу получить всех друзей, но я хочу, чтобы id 5 был первым пунктом в списке. Меня не волнует порядок, который я получаю остальные предметы.
желаемый результат запроса будет:
friends
-------
id name
5 nahum
1 moshe
2 haim
3 yusuf
4 gedalia
6 dana
Как я могу это сделать?
использование Mysql 5.1.x.
спасибо!
6 ответов:
select id,name from friends order by id=5 desc
(учитывая, что вы не заботитесь о порядке остальное, в противном случае, например,отдых по id asc)
select id,name from friends order by id=5 desc, id asc
попробуйте это:
select id,name from friends order by case when id=5 then -1 else id end
Если у вас есть более тогда один можно сделать:
select id,name from friends order by case when id in (5,15,25) then -1 else id end,id
Я не могу получить доступ к MySQL сейчас, чтобы проверить, так что это может быть отменено... но вы можете использовать тот факт, что логические значения также сортируются, и что у вас может быть несколько полей сортировки.
SELECT ... ORDER BY id != 5, id
(возможно, вам придется писать
id = 5
, Я не могу вспомнить, сортируются ли истины до или после фальсификаций.)EDIT: О, я только что прочитал, что вас не волнует порядок остальных, и в этом случае я сердечно рекомендую ответ @Richard.
Если вы хотите сделать то же самое для UNION query, например, если у вас есть:
select id,name from friends UNION select id,name from friends order by id=5 desc
... вы получите исключение в PostgreSQL:
можно использовать только имена столбцов результатов, а не выражения или функции. Подсказка: добавьте выражение / функцию к каждому SELECT или переместите объединение в предложение from
чтобы обойти это, вы должны использовать следующее:
select id,name, (id=5) AS is_five from friends UNION select id,name, (id=5) AS is_five from friends order by is_five DESC, id DESC
выражение (id=5) вернет 't' или 'f', в зависимости от того, равно ли значение вашего столбца ожидаемому значению (5), поэтому order by сначала упорядочивает столбцы 't', а затем остальные.
вы должны использовать предложение MySQL ORDER BY FIELD для решения этой проблемы. Хотя ответ был принят, то вот лучшее решение.
select 1 id, 'Zeta' order_col union all select 2 id, 'Alpha' order_col union all select 3 id, 'Gamma' order_col union all select 4 id, 'Phi' order_col union all select 5 id, 'Delta' order_col union all select 6 id, 'Delta' order_col union all select 7 id, 'Alpha' order_col union all select 8 id, 'Gamma' order_col union all select 9 id, 'Zeta' order_col union all select 10 id, 'Phi' order_col order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;
Это лучше, чем
- id=что-то, заказ по id asc
- порядок по случаю, когда что-то то 1 когда something_else то 2 Конец desc