これを行うPostgresの方法:
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
-
キーワード
ASテーブルエイリアスの単なるノイズです。ただし、列エイリアスから省略しないでください。 「ASキーワードの省略」に関するマニュアル:FROMで 標準とPostgreSQLの両方のアイテムでASが許可されます 予約されていないキーワードであるエイリアスの前に省略されます。ただし、構文があいまいなため、これは出力列名には実用的ではありません 。大胆な強調鉱山。
-
ISNULL()MySQLまたはSQLServerのカスタム拡張です。 PostgresはSQL標準関数COALESCE()を使用します 。しかし、ここでも必要ありません。NULLS LASTを使用します 代わりに、より高速でクリーンな句。参照:- PostgreSQLは日時ascで並べ替え、最初はnullですか?
-
複数のユーザーが同じ数の友達を持つことになります。これらのピアは任意にソートされます。繰り返し実行すると、異なるソート順が生成される可能性がありますが、これは通常は望ましくありません。
ORDER BYに式を追加します タイブレーカーとして。最終的に、主キーは残りのあいまいさを解決します。 -
2つのテーブルが同じ列名を共有している場合
user_id(必要に応じて)構文ショートカットUSINGを使用できます join句で。もう1つの標準SQL機能。ウェルカム副作用:user_idSELECT *の出力に1回だけリストされます 、ONで結合する場合とは対照的に 。多くのクライアントは、出力で重複する列名を受け入れません。