Sposób, w jaki Postgres to zrobić:
SELECT *
FROM users u
LEFT JOIN (
SELECT user_id, count(*) AS friends
FROM friends
) f USING (user_id)
ORDER BY f.friends DESC NULLS LAST, user_id -- as tiebreaker
-
Słowo kluczowe
AS
to tylko szum dla aliasów tabel. Ale nie pomijaj go w aliasach kolumn. Podręcznik „Pominięcie słowa kluczowego AS”:W
FROM
elementy, zarówno standardowe, jak i PostgreSQL pozwalają naAS
być pominiętym przed aliasem, który jest niezastrzeżonym słowem kluczowym. Ale jest to niepraktyczne w przypadku nazw kolumn wyjściowych ze względu na niejasności składniowe .Pogrubiony nacisk na moje.
-
ISNULL()
to niestandardowe rozszerzenie MySQL lub SQL Server. Postgres używa standardowej funkcji SQLCOALESCE()
. Ale ty też nie potrzebujesz tutaj. UżyjNULLS LAST
zamiast tego, który jest szybszy i czystszy. Zobacz:- PostgreSQL sortuje według daty i godziny asc, najpierw null?
-
Wielu użytkowników będzie miało tę samą liczbę znajomych. Ci rówieśnicy byliby sortowani arbitralnie. Wielokrotne wykonanie może dać inny porządek sortowania, co zwykle nie jest pożądane. Dodaj więcej wyrażeń do
ORDER BY
jako rozstrzygający remisy. Ostatecznie klucz podstawowy rozwiązuje wszelkie pozostałe niejednoznaczności. -
Jeśli dwie tabele mają tę samą nazwę kolumny
user_id
(tak jak powinny) możesz użyć skrótu składniUSING
w klauzuli łączenia. Kolejna standardowa funkcja SQL. Powitalny efekt uboczny:user_id
jest wymieniony tylko raz w danych wyjściowych dlaSELECT *
, w przeciwieństwie do łączenia zON
. Wielu klientów nie zaakceptowałoby nawet zduplikowanych nazw kolumn w danych wyjściowych.