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
ASto tylko szum dla aliasów tabel. Ale nie pomijaj go w aliasach kolumn. Podręcznik „Pominięcie słowa kluczowego AS”:W
FROMelementy, zarówno standardowe, jak i PostgreSQL pozwalają naASbyć 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 LASTzamiast 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 BYjako 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ładniUSINGw klauzuli łączenia. Kolejna standardowa funkcja SQL. Powitalny efekt uboczny:user_idjest 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.