Il modo Postgres per farlo:
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
-
La parola chiave
AS
è solo un rumore per gli alias di tabella. Ma non ometterlo dagli alias di colonna. Il manuale su "Omissione della parola chiave AS":In
FROM
elementi, sia lo standard che PostgreSQL consentonoAS
da omettere prima di un alias che è una parola chiave non riservata. Ma questo è non pratico per i nomi delle colonne di output, a causa di ambiguità sintattiche .Enfasi in grassetto la mia.
-
ISNULL()
è un'estensione personalizzata di MySQL o SQL Server. Postgres utilizza la funzione standard SQLCOALESCE()
. Ma non ti serve neanche qui. UsaNULLS LAST
clausola invece, che è più veloce e più pulita. Vedi:- PostgreSQL ordina per datetime asc, null prima?
-
Più utenti avranno lo stesso numero di amici. Questi peer verrebbero ordinati arbitrariamente. L'esecuzione ripetuta potrebbe produrre un ordinamento diverso, che in genere non è desiderabile. Aggiungi più espressioni a
ORDER BY
come spareggio. In definitiva, la chiave primaria risolve ogni ambiguità rimanente. -
Se le due tabelle condividono lo stesso nome di colonna
user_id
(come dovrebbero) puoi usare la scorciatoia sintatticaUSING
nella clausola di unione. Un'altra caratteristica SQL standard. Effetto collaterale di benvenuto:user_id
è elencato solo una volta nell'output perSELECT *
, al contrario di quando ti unisci conON
. Molti client non accetterebbero nemmeno nomi di colonne duplicati nell'output.