La manière Postgres de faire cela :
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
-
Le mot-clé
AS
est juste du bruit pour les alias de table. Mais ne l'omettez pas des alias de colonne. Le manuel sur "Omettre le mot clé AS":Dans
FROM
les éléments, à la fois le standard et PostgreSQL autorisentAS
à omettre avant un alias qui est un mot-clé non réservé. Mais cela n'est pas pratique pour les noms de colonne de sortie, en raison d'ambiguïtés syntaxiques .J'insiste sur moi.
-
ISNULL()
est une extension personnalisée de MySQL ou SQL Server. Postgres utilise la fonction standard SQLCOALESCE()
. Mais vous n'avez pas besoin non plus ici. Utilisez leNULLS LAST
clause à la place, qui est plus rapide et plus propre. Voir :- PostgreSQL trier par datetime asc, null en premier ?
-
Plusieurs utilisateurs auront le même nombre d'amis. Ces pairs seraient triés arbitrairement. Une exécution répétée peut produire un ordre de tri différent, ce qui n'est généralement pas souhaitable. Ajouter plus d'expressions à
ORDER BY
comme bris d'égalité. En fin de compte, la clé primaire résout toute ambiguïté restante. -
Si les deux tables partagent le même nom de colonne
user_id
(comme ils le devraient), vous pouvez utiliser le raccourci de syntaxeUSING
dans la clause de jointure. Une autre fonctionnalité SQL standard. Effet secondaire de bienvenue :user_id
n'est répertorié qu'une seule fois dans la sortie pourSELECT *
, contrairement à la jointure avecON
. De nombreux clients n'accepteraient même pas les noms de colonne en double dans la sortie.