mysql SQL: определенный элемент должен быть первым, а затем отсортировать остальные элементы


допустим у меня в таблице ниже.

Я хочу получить всех друзей, но я хочу, чтобы id 5 был первым пунктом в списке. Меня не волнует порядок, который я получаю остальные предметы.

желаемый результат запроса будет:

friends
-------

id    name

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

Как я могу это сделать?

использование Mysql 5.1.x.

спасибо!

6 59

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

Это немного некрасиво, потому что он имеет дублирование кода, но он делает трюк:

select .... where id = 5 
union
select .... where not id = 5