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 PostgreSQLAS
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-StandardfunktionCOALESCE()
. Aber beides braucht man hier nicht. Verwenden Sie dieNULLS 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üpfungUSING
verwenden in der Join-Klausel. Ein weiteres Standard-SQL-Feature. Willkommener Nebeneffekt:user_id
wird nur einmal in der Ausgabe fürSELECT *
aufgeführt , im Gegensatz zum Verbinden mitON
. Viele Clients würden nicht einmal doppelte Spaltennamen in der Ausgabe akzeptieren.