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
ASer bare støj til bordaliasser. Men udelad det ikke fra kolonnealiasser. Manualen om "Udeladelse af AS-nøgleordet":I
FROMelementer, både standarden og PostgreSQL tilladerASskal 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 LASTklausul 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 BYsom 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 syntaksgenvejenUSINGi tilslutningsklausulen. En anden standard SQL-funktion. Velkommen bivirkning:user_ider 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.