Postgres sätt att göra detta:
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
-
Nyckelordet
AS
är bara brus för tabellalias. Men utelämna det inte från kolumnalias. Manualen om "Utelämna AS-nyckelordet":I
FROM
objekt, både standarden och PostgreSQL tillåterAS
ska utelämnas före ett alias som är ett oreserverat nyckelord. Men detta är opraktiskt för namn på utdatakolumner, på grund av syntaktiska oklarheter .Djärv betoning min.
-
ISNULL()
är en anpassad förlängning av MySQL eller SQL Server. Postgres använder SQL-standardfunktionenCOALESCE()
. Men du behöver inte heller här. AnvändNULLS LAST
klausul istället, som är snabbare och renare. Se:- PostgreSQL sortera efter datetime asc, null först?
-
Flera användare kommer att ha samma antal vänner. Dessa kamrater skulle sorteras godtyckligt. Upprepad körning kan ge en annan sorteringsordning, vilket vanligtvis inte är önskvärt. Lägg till fler uttryck i
ORDER BY
som tiebreaker. I slutändan löser primärnyckeln eventuell återstående oklarhet. -
Om de två tabellerna delar samma kolumnnamn
user_id
(som de borde) kan du använda syntaxgenvägenUSING
i anslutningsklausulen. En annan standard SQL-funktion. Välkommen bieffekt:user_id
är bara listad en gång i utgången förSELECT *
, till skillnad från när du går med medON
. Många klienter skulle inte ens acceptera dubbletter av kolumnnamn i utdata.