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
FROMelementi, sia lo standard che PostgreSQL consentonoASda 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 LASTclausola 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 BYcome 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 sintatticaUSINGnella 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.