mysql SQL: конкретний елемент повинен бути першим, а потім сортувати решту елементів


80

Скажімо, у мене є таблиця нижче.

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

Результатом запиту буде:

friends
-------

id    name

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

Як я можу це зробити?

за допомогою Mysql 5.1.x.

Дякую!

Відповіді:


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

(якщо ви не дбаєте про порядок відпочинку, інакше, наприклад, відпочинок за ідентифікатором asc )

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

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, я не пам'ятаю, чи ІСТИНИ сортуються до або після FALSE.)

EDIT: О, я щойно прочитав, що вас не хвилює порядок решти, і в цьому випадку я від душі рекомендую відповідь @ Richard.


3
Я вважаю за краще id=5 desc, тому що коли стовпець включає nulls, !=5ставить nulls першим
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

Для вирішення цього питання слід використовувати пункт ORDER BY FIELD MySQL. Хоча, відповідь на це прийнята, ось краще рішення.

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 = щось, упорядкувати за ідентифікатором asc
  • впорядковувати у випадку, коли щось потім 1, коли something_else потім 2 кінці desc

1
Не знаю, чому це було проти. Я хотів би знати, чому порядок за полями повинен бути кращим, але відповідь цікава ...
Джон

@ John - Це краще переважно через легкість читабельності. Крім того, це рішення, яке MySQL надає нам нестандартно. Мені просто здається, що коли вам потрібно вказати порядок для багатьох значень у стовпці, це має більше сенсу.
MontyPython

1
Думаю, люди просто не зрозуміли, що ви подали приклад із «об’єднанням усіх» та рішення питання із полем ЗАМОВИТИ. Таким чином, проти - лише через некомпетентність.
Джон

Я перевіряю всі свої відповіді, маючи на увазі пост @ Strawberry - meta.stackoverflow.com/questions/333952/… .
MontyPython

2

Ви можете використовувати field()в MySQL.

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

1-й параметр у полі () означає поле, з яким потрібно сортувати, решта - упорядкування.

Отже, 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, це відсортує весь союз.
Андомар,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.