PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Requête à ORDER BY le nombre de lignes renvoyées par un autre SELECT

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 autorisent AS à 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 SQL COALESCE() . Mais vous n'avez pas besoin non plus ici. Utilisez le NULLS 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 syntaxe USING 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 pour SELECT * , contrairement à la jointure avec ON . De nombreux clients n'accepteraient même pas les noms de colonne en double dans la sortie.