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
FROMobjekt, både standarden och PostgreSQL tillåterASska 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 LASTklausul 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 BYsom 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ägenUSINGi 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.