Cara Postgres untuk melakukan ini:
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
-
Kata kunci
AS
hanyalah noise untuk alias tabel. Tapi jangan menghilangkannya dari alias kolom. Panduan tentang "Menghilangkan Kata Kunci AS":Dalam
FROM
item, baik standar dan PostgreSQL mengizinkanAS
untuk dihilangkan sebelum alias yang merupakan kata kunci tanpa syarat. Tapi ini tidak praktis untuk nama kolom keluaran, karena ambiguitas sintaksis .Penekanan saya yang berani.
-
ISNULL()
adalah ekstensi kustom MySQL atau SQL Server. Postgres menggunakan fungsi standar SQLCOALESCE()
. Tetapi Anda tidak perlu keduanya di sini. GunakanNULLS LAST
klausa sebagai gantinya, yang lebih cepat dan lebih bersih. Lihat:- Urutkan PostgreSQL berdasarkan datetime asc, null dulu?
-
Beberapa pengguna akan memiliki jumlah teman yang sama. Rekan-rekan ini akan diurutkan secara sewenang-wenang. Eksekusi berulang mungkin menghasilkan urutan pengurutan yang berbeda, yang biasanya tidak diinginkan. Tambahkan lebih banyak ekspresi ke
ORDER BY
sebagai pemutus ikatan. Pada akhirnya, kunci utama menyelesaikan ambiguitas yang tersisa. -
Jika kedua tabel memiliki nama kolom yang sama
user_id
(seperti yang seharusnya) Anda dapat menggunakan pintasan sintaksUSING
dalam klausa gabung. Fitur SQL standar lainnya. Efek samping sambutan:user_id
hanya terdaftar sekali dalam output untukSELECT *
, berbeda dengan saat bergabung denganON
. Banyak klien bahkan tidak mau menerima nama kolom duplikat dalam output.