これを行う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_id
SELECT *
の出力に1回だけリストされます 、ON
で結合する場合とは対照的に 。多くのクライアントは、出力で重複する列名を受け入れません。