mysql SQL: konkretny element jako pierwszy, a następnie do sortowania pozostałych elementów

80

Powiedzmy, że mam poniższą tabelę.

Chcę zdobyć wszystkich znajomych, ale chcę, aby identyfikator 5 był pierwszą pozycją na liście. Nie obchodzi mnie kolejność, w jakiej otrzymam pozostałe elementy.

Żądanym wynikiem zapytania będzie:

friends
-------

id    name

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

Jak mogę to zrobić?

przy użyciu MySQL 5.1.x.

Dzięki!

ufk
źródło

Odpowiedzi:

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

(pod warunkiem, że nie obchodzi Cię kolejność reszty, w przeciwnym razie np. odpoczynek przez id asc )

select id,name 
from friends 
order by id=5 desc, id asc
RichardTheKiwi
źródło
10
@ maxx777 To pytanie jest oznaczone jako MySQL, które jest teraz własnością Oracle. Nie „sql-server”, jak w Microsoft SQL Server.
RichardTheKiwi
1
Myślę, że większość zapytań działa na wszystkich DBMS. A jeśli ktoś mówi, że to zapytanie nie działa na konkretnym DBMS, zwykle prosi o rozwiązanie dla tego konkretnego DBMS.
maxx777
8
@ maxx777 Dlatego mamy tagi i oddzielne pytania. To zadziałało dla pytającego w jego problemie z MySQL. Jeśli chcesz SQL Server 2005, druga odpowiedź ma to, nie musisz komentować oczywistego, że ta odpowiedź nie działa w przypadku tego, nad czym nigdy nie była reklamowana.
RichardTheKiwi
48

Spróbuj tego:

select id,name 
from friends 
order by case when id=5 then -1 else id end

jeśli masz więcej, możesz zrobić:

select id,name 
from friends 
order by case when id in (5,15,25) then -1 else id end,id
Dumitrescu Bogdan
źródło
4

Nie mogę teraz uzyskać dostępu do MySQL, aby przetestować, więc można to odwrócić ... ale możesz wykorzystać fakt, że Booleans również sortuje i możesz mieć kilka pól sortowania.

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

(być może będziesz musiał napisać id = 5, nie pamiętam, czy wartości PRAWDA są sortowane przed, czy po FAŁSZACH).

EDYCJA: Och, właśnie przeczytałem, że nie obchodzi cię kolejność reszty, w takim przypadku serdecznie polecam odpowiedź @ Richarda.

Amadan
źródło
3
Wolę id=5 desc, ponieważ kiedy kolumna zawiera wartości null, !=5stawia je na pierwszym miejscu
RichardTheKiwi
2

Jeśli chcesz zrobić to samo dla zapytania UNION, na przykład jeśli masz:

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

... dostałbyś wyjątek w PostgreSQL:

Można używać tylko nazw kolumn wynikowych, a nie wyrażeń ani funkcji. WSKAZÓWKA: Dodaj wyrażenie / funkcję do każdego SELECT lub przenieś UNION do klauzuli from

Aby obejść ten problem, możesz użyć:

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

Wyrażenie (id = 5) zwróciło „t” LUB „f”, w zależności od tego, czy wartość kolumny jest równa wartości oczekiwanej (5), czy nie, więc kolejność według najpierw uporządkowałaby kolumny „t”, a następnie odpoczynek.

Ucello
źródło
2

Aby rozwiązać ten problem, powinieneś użyć klauzuli ORDER BY FIELD MySQL. Chociaż odpowiedź została przyjęta w tej sprawie, oto lepsze rozwiązanie.

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;

To jest lepsze niż

  • id = coś, uporządkuj według id rosnąco
  • uporządkuj według wielkości liter, gdy coś wtedy 1, gdy coś_else, a następnie 2 koniec desc
MontyPython
źródło
1
Nie wiem, dlaczego ten głos został odrzucony. Chciałbym wiedzieć, dlaczego porządkowanie według pól powinno być lepsze, ale odpowiedź jest interesująca…
Jan
@John - Jest to lepsze głównie ze względu na łatwość czytania. Jest to również rozwiązanie, które MySQL dostarcza nam po wyjęciu z pudełka. Po prostu wydaje mi się, że kiedy trzeba określić kolejność wielu wartości w kolumnie, ma to większy sens.
MontyPython
1
Myślę, że ludzie po prostu nie rozumieli, że podaliście przykład z „ujednoliceniem wszystkich” i rozwiązaniem pytania z polem ORDER BY. Tak więc głosy przeciwne, to tylko z powodu niekompetencji.
John
Wszystkie odpowiedzi sprawdzam pamiętając o poście @ Strawberry - meta.stackoverflow.com/questions/333952/… .
MontyPython
2

Możesz użyć field()w MySQL.

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

Pierwszy parametr w polu () oznacza pole, według którego chcesz sortować, reszta to kolejność.

Tak więc 5 zostanie posortowane jako pierwsze, a reszta z id (bez 5). Możesz zrobić, field(id,5,1,3,id)jeśli chcesz, aby 5,1,3 było z przodu.

Ostatecznie można wybrać opcję sortowania według 5 field(id,id,5). Drugi identyfikator również wykluczy z niego 5.

Jeffrey Neo
źródło
-7

Jest to trochę brzydkie, ponieważ zawiera duplikaty kodu, ale robi to:

select .... where id = 5 
union
select .... where not id = 5
Ilya Kogan
źródło
2
Jeśli wiersze pozostają uporządkowane po połączeniu, to tylko przypadek. A jeśli określisz order by, posortuje on całą unię.
Andomar