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!
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
źródło
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.
źródło
id=5 desc
, ponieważ kiedy kolumna zawiera wartości null,!=5
stawia je na pierwszym miejscuJeś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.
źródło
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ż
źródło
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.źródło
Jest to trochę brzydkie, ponieważ zawiera duplikaty kodu, ale robi to:
select .... where id = 5 union select .... where not id = 5
źródło
order by
, posortuje on całą unię.