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
ASist nur Rauschen für Tabellenaliase. Aber lassen Sie es nicht in den Spaltenaliasen weg. Das Handbuch zum "Weglassen des AS-Schlüsselworts":In
FROMElemente erlauben sowohl der Standard als auch PostgreSQLASmuss 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 LASTKlausel 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 BYweitere 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üpfungUSINGverwenden in der Join-Klausel. Ein weiteres Standard-SQL-Feature. Willkommener Nebeneffekt:user_idwird 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.