Ответ 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
Скажем, у меня есть таблица ниже.
Я хочу получить всех друзей, но я хочу, чтобы идентификатор 5 был первым элементом в списке. Мне все равно, что я получаю остальные предметы.
Желаемый результат запроса будет:
friends
-------
id name
5 nahum
1 moshe
2 haim
3 yusuf
4 gedalia
6 dana
Как я могу это сделать?
с использованием Mysql 5.1.x.
Спасибо!
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 для тестирования, поэтому его можно было бы отменить... но вы можете использовать тот факт, что Booleans также сортируют и могут иметь несколько полей сортировки.
SELECT ... ORDER BY id != 5, id
(вам может потребоваться написать id = 5
, я не могу вспомнить, сортируют ли TRUE до или после FALSE.)
EDIT: О, я просто прочитал, что вас не волнует порядок остальных, и в этом случае я сердечно рекомендую ответить @Richard.
Если вы хотите сделать то же самое для запроса 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', то остальные.
Это немного уродливо, потому что у него есть дублирование кода, но он делает трюк:
select .... where id = 5
union
select .... where not id = 5