PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfrage zum ORDER BY die Anzahl der Zeilen, die von einem anderen SELECT zurückgegeben werden

Der Postgres-Weg dazu:

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
  • Das Schlüsselwort AS ist nur Rauschen für Tabellenaliase. Aber lassen Sie es nicht in den Spaltenaliasen weg. Das Handbuch zum "Weglassen des AS-Schlüsselworts":

    In FROM Elemente erlauben sowohl der Standard als auch PostgreSQL AS muss vor einem Alias ​​weggelassen werden, der ein nicht reserviertes Schlüsselwort ist. Aber das ist wegen syntaktischer Mehrdeutigkeiten unpraktisch für Ausgabespaltennamen .

    Fettdruck von mir.

  • ISNULL() ist eine benutzerdefinierte Erweiterung von MySQL oder SQL Server. Postgres verwendet die SQL-Standardfunktion COALESCE() . Aber beides braucht man hier nicht. Verwenden Sie die NULLS LAST Klausel stattdessen, was schneller und sauberer ist. Siehe:

    • PostgreSQL sortiert nach datetime asc, null zuerst?
  • Mehrere Benutzer haben die gleiche Anzahl von Freunden. Diese Peers würden willkürlich sortiert. Eine wiederholte Ausführung kann zu einer anderen Sortierreihenfolge führen, was normalerweise nicht wünschenswert ist. Fügen Sie ORDER BY weitere Ausdrücke hinzu als Tiebreak. Letztendlich löst der Primärschlüssel alle verbleibenden Mehrdeutigkeiten auf.

  • Wenn die beiden Tabellen denselben Spaltennamen haben user_id (wie sie sollten) können Sie die Syntaxverknüpfung USING verwenden in der Join-Klausel. Ein weiteres Standard-SQL-Feature. Willkommener Nebeneffekt:user_id wird nur einmal in der Ausgabe für SELECT * aufgeführt , im Gegensatz zum Verbinden mit ON . Viele Clients würden nicht einmal doppelte Spaltennamen in der Ausgabe akzeptieren.