Начинът на Postgres да направите това:
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
-
Ключовата дума
AS
е просто шум за псевдоними на таблици. Но не го пропускайте от псевдоними на колони. Ръководството за „Пропускане на ключовата дума на AS“:В
FROM
елементи, както стандартният, така и PostgreSQL позволяватAS
да бъде пропуснат пред псевдоним, който е нерезервирана ключова дума. Но това е непрактично за имената на изходни колони, поради синтактични неясноти .Удебелен акцент мой.
-
ISNULL()
е персонализирано разширение на MySQL или SQL Server. Postgres използва стандартната SQL функцияCOALESCE()
. Но тук не ви трябва нито едно. ИзползвайтеNULLS LAST
вместо това клауза, която е по-бърза и по-чиста. Вижте:- PostgreSQL сортиране по datetime asc, първо нула?
-
Множество потребители ще имат еднакъв брой приятели. Тези партньори ще бъдат сортирани произволно. Повторното изпълнение може да доведе до различен ред на сортиране, което обикновено не е желателно. Добавете още изрази към
ORDER BY
като тайбрек. В крайна сметка първичният ключ разрешава всички останали неясноти. -
Ако двете таблици споделят едно и също име на колона
user_id
(както трябва) можете да използвате прекия път на синтаксисаUSING
в клаузата за присъединяване. Друга стандартна SQL функция. Страничен ефект за добре дошли:user_id
е посочен само веднъж в изхода заSELECT *
, за разлика от при присъединяване сON
. Много клиенти дори не биха приели дублиращи се имена на колони в изхода.