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
AS
is gewoon ruis voor tabelaliassen. Maar laat het niet weg uit kolomaliassen. De handleiding over "Het AS-sleutelwoord weglaten":In
FROM
items, zowel de standaard als PostgreSQL staan AS
toe 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 LAST
clausule 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 BY
als 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_id
wordt slechts één keer vermeld in de uitvoer voorSELECT *
, in tegenstelling tot bij deelname metON
. Veel klanten accepteren zelfs geen dubbele kolomnamen in de uitvoer.