PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Interroga per ORDER BY il numero di righe restituite da un altro SELECT

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 consentono AS 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 SQL COALESCE() . Ma non ti serve neanche qui. Usa NULLS 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 sintattica USING nella clausola di unione. Un'altra caratteristica SQL standard. Effetto collaterale di benvenuto:user_id è elencato solo una volta nell'output per SELECT * , al contrario di quando ti unisci con ON . Molti client non accetterebbero nemmeno nomi di colonne duplicati nell'output.