Postgres måde at gøre dette på:
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øgeordet
AS
er bare støj til bordaliasser. Men udelad det ikke fra kolonnealiasser. Manualen om "Udeladelse af AS-nøgleordet":I
FROM
elementer, både standarden og PostgreSQL tilladerAS
skal udelades før et alias, der er et ureserveret nøgleord. Men dette er upraktisk til outputkolonnenavne på grund af syntaktiske tvetydigheder .Fed fremhævelse mine.
-
ISNULL()
er en tilpasset udvidelse af MySQL eller SQL Server. Postgres bruger SQL-standardfunktionenCOALESCE()
. Men du behøver heller ikke her. BrugNULLS LAST
klausul i stedet, som er hurtigere og renere. Se:- PostgreSQL sorteres efter datetime asc, null først?
-
Flere brugere vil have det samme antal venner. Disse peers ville blive sorteret vilkårligt. Gentagen udførelse kan give en anden sorteringsrækkefølge, hvilket typisk ikke er ønskeligt. Tilføj flere udtryk til
ORDER BY
som tiebreaker. I sidste ende løser den primære nøgle enhver resterende tvetydighed. -
Hvis de to tabeller deler det samme kolonnenavn
user_id
(som de burde) kan du bruge syntaksgenvejenUSING
i tilslutningsklausulen. En anden standard SQL-funktion. Velkommen bivirkning:user_id
er kun opført én gang i outputtet forSELECT *
, i modsætning til når du tilslutter dig medON
. Mange klienter ville ikke engang acceptere duplikerede kolonnenavne i outputtet.