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

80

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

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

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

friends
-------

id    name

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

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

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

Благодаря!

ufk
источник

Ответы:

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

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

select id,name 
from friends 
order by id=5 desc, id asc
RichardTheKiwi
источник
10
@ maxx777 Этот вопрос помечен тегом MySQL, который теперь принадлежит Oracle. Не «sql-сервер», как в Microsoft SQL Server.
RichardTheKiwi
1
Я думаю, что большинство запросов работает на всех СУБД. И если кто-то говорит, что этот запрос не работает в конкретной СУБД, обычно он запрашивает решение для этой конкретной СУБД.
maxx777
8
@ maxx777 Поэтому у нас есть теги и отдельные вопросы. Это сработало для спрашивающего с его проблемой MySQL. Если вам нужен SQL Server 2005, есть другой ответ, нет необходимости комментировать очевидное, что этот ответ не работает с тем, над чем он никогда не рекламировался.
RichardTheKiwi
48

Попробуй это:

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

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

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

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

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

Амадан
источник
3
Я предпочитаю id=5 desc, потому что, когда столбец включает нули, !=5сначала ставит нули
RichardTheKiwi
2

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

Учелло
источник
2

Для решения этой проблемы вы должны использовать предложение 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 = something, упорядочить по id по возрастанию
  • по порядку when something then 1 when something_else then 2 end desc
MontyPython
источник
1
Не уверен, почему это было отклонено. Я хотел бы знать, почему порядок по полю должен быть лучше, но ответ интересный ..
Джон
@John - это лучше в основном из-за простоты чтения. Кроме того, это решение, которое MySQL предоставляет нам из коробки. Мне просто кажется, что когда вам нужно указать порядок для большого количества значений в столбце, это имеет больше смысла.
MontyPython
1
Думаю, люди просто не поняли, что вы привели пример с «объединением всех» и решение вопроса с полем ORDER BY. Таким образом, отрицательные голоса объясняются просто некомпетентностью.
Джон
Я проверяю все свои ответы, имея в виду сообщение @ Strawberry - meta.stackoverflow.com/questions/333952/… .
MontyPython
2

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

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

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

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

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

Джеффри Нео
источник
-7

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

select .... where id = 5 
union
select .... where not id = 5
Илья Коган
источник
2
Если после объединения строки остаются упорядоченными, это просто случайность. И если вы укажете order by, он отсортирует весь союз.
Andomar