De Postgres-manier om dit te doen:
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
-
Het trefwoord
ASis gewoon ruis voor tabelaliassen. Maar laat het niet weg uit kolomaliassen. De handleiding over "Het AS-sleutelwoord weglaten":In
FROMitems, zowel de standaard als PostgreSQL staan AStoe moet worden weggelaten vóór een alias die een niet-gereserveerd sleutelwoord is. Maar dit is onpraktisch voor namen van uitvoerkolommen, vanwege syntactische dubbelzinnigheden .Vetgedrukte nadruk van mij.
-
ISNULL()is een aangepaste extensie van MySQL of SQL Server. Postgres gebruikt de SQL-standaardfunctieCOALESCE(). Maar dat heb je hier ook niet nodig. Gebruik deNULLS LASTclausule in plaats daarvan, die sneller en schoner is. Zie:- PostgreSQL sorteren op datum/tijd asc, eerst null?
-
Meerdere gebruikers hebben hetzelfde aantal vrienden. Deze peers zouden willekeurig worden gesorteerd. Herhaalde uitvoering kan een andere sorteervolgorde opleveren, wat doorgaans niet wenselijk is. Voeg meer uitdrukkingen toe aan
ORDER BYals tiebreak. Uiteindelijk lost de primaire sleutel alle resterende ambiguïteit op. -
Als de twee tabellen dezelfde kolomnaam hebben
user_id(zoals ze zouden moeten) je kunt de syntaxissnelkoppelingUSING. gebruiken in de join-clausule. Een andere standaard SQL-functie. Welkom neveneffect:user_idwordt slechts één keer vermeld in de uitvoer voorSELECT *, in tegenstelling tot bij deelname metON. Veel klanten accepteren zelfs geen dubbele kolomnamen in de uitvoer.