MySQL SQL: конкретный элемент, чтобы быть первым, а затем сортировать остальные элементы - PullRequest
67 голосов
/ 24 марта 2011

Допустим, у меня есть таблица ниже.

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

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

friends
-------

id    name

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

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

используя Mysql 5.1.x.

Спасибо!

Ответы [ 7 ]

128 голосов
/ 24 марта 2011
select id,name 
from friends 
order by id=5 desc

(если вам не важен порядок остальных, например, rest by id asc )

select id,name 
from friends 
order by id=5 desc, id asc
45 голосов
/ 24 марта 2011

Попробуйте:

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
4 голосов
/ 24 марта 2011

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

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

(возможно, вам придется написать id = 5, я не могу вспомнить, сортируют ли ИСТИНЫ до или после ЛОЖЕЙ.)

РЕДАКТИРОВАТЬ: О, я только что прочитал, что вы не заботитесь о порядке остальных, и в этом случае я от всей души рекомендую ответ @ Ричарда.

1 голос
/ 08 декабря 2017

Если вы хотите сделать то же самое для запроса 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', затемостальное.

0 голосов
/ 15 марта 2019

Вы можете использовать field() в MySQL.

select id,name from friends order by field(id,5,id)

1-й параметр в field () означает поле, с которым вы хотите отсортировать, остальные упорядочены.

Таким образом, 5 будет сортироваться первым, а остальные по id (без 5). Вы можете сделать как field(id,5,1,3,id), если хотите, чтобы 5,1,3 были впереди.

5 можно выбрать для сортировки, наконец, по field(id,id,5). 2-й идентификатор также исключит 5 из них.

0 голосов
/ 18 января 2018

Вы должны использовать предложение 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, когда что-то, а затем 2 и конец
0 голосов
/ 24 марта 2011

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

select .... where id = 5 
union
select .... where not id = 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...