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
AShanyalah noise untuk alias tabel. Tapi jangan menghilangkannya dari alias kolom. Panduan tentang "Menghilangkan Kata Kunci AS":Dalam
FROMitem, baik standar dan PostgreSQL mengizinkanASuntuk 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 LASTklausa 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 BYsebagai 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 sintaksUSINGdalam klausa gabung. Fitur SQL standar lainnya. Efek samping sambutan:user_idhanya terdaftar sekali dalam output untukSELECT *, berbeda dengan saat bergabung denganON. Banyak klien bahkan tidak mau menerima nama kolom duplikat dalam output.