Подтвердить что ты не робот

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

Скажем, у меня есть таблица ниже.

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

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

friends
-------

id    name

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

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

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

Спасибо!

4b9b3361

Ответ 1

select id,name 
from friends 
order by id=5 desc

(учитывая, что вы не заботитесь о порядке остальных, иначе, например, отдыхайте по id asc)

select id,name 
from friends 
order by id=5 desc, id asc

Ответ 2

Попробуйте следующее:

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

Ответ 3

Теперь я не могу получить доступ к MySQL для тестирования, поэтому его можно было бы отменить... но вы можете использовать тот факт, что Booleans также сортируют и могут иметь несколько полей сортировки.

SELECT ... ORDER BY id != 5, id

(вам может потребоваться написать id = 5, я не могу вспомнить, сортируют ли TRUE до или после FALSE.)

EDIT: О, я просто прочитал, что вас не волнует порядок остальных, и в этом случае я сердечно рекомендую ответить @Richard.

Ответ 4

Если вы хотите сделать то же самое для запроса UNION, например, если у вас есть:

select id,name 
from friends 
UNION
select id,name 
from friends 
order by id=5 desc

... вы получите исключение в PostgreSQL:

Можно использовать имена столбцов только результата, а не выражения или функции. СОВЕТ: добавьте выражение/функцию к каждому SELECT или переместите UNION в предложение 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), поэтому порядок сначала будет упорядочивать столбцы 't', то остальные.

Ответ 5

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

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