Cách Postgres để làm điều này:
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
-
Từ khóa
ASchỉ là tiếng ồn cho bí danh bảng. Nhưng đừng bỏ qua nó khỏi bí danh cột. Hướng dẫn về "Bỏ qua Từ khóa AS":Trong
FROMcác mục, cả tiêu chuẩn và PostgreSQL đều cho phépASđược bỏ qua trước bí danh là từ khóa chưa được lưu trữ. Nhưng đây là không thực tế đối với tên cột đầu ra, vì sự mơ hồ về cú pháp .Nhấn mạnh đậm của tôi.
-
ISNULL()là một phần mở rộng tùy chỉnh của MySQL hoặc SQL Server. Postgres sử dụng hàm chuẩn SQLCOALESCE(). Nhưng bạn không cần cả hai ở đây. Sử dụngNULLS LASTthay vào đó, mệnh đề nhanh hơn và sạch hơn. Xem:- PostgreSQL sắp xếp theo datetime asc, null trước?
-
Nhiều người dùng sẽ có cùng một số lượng bạn bè. Các đồng nghiệp này sẽ được sắp xếp tùy ý. Việc thực thi lặp đi lặp lại có thể mang lại thứ tự sắp xếp khác nhau, điều này thường không được mong muốn. Thêm các biểu thức khác vào
ORDER BYnhư tiebreaker. Cuối cùng, khóa chính giải quyết bất kỳ sự mơ hồ nào còn lại. -
Nếu hai bảng có cùng tên cột
user_id(giống như họ nên làm) bạn có thể sử dụng phím tắt cú phápUSINGtrong mệnh đề nối. Một tính năng SQL tiêu chuẩn khác. Tác dụng phụ chào mừng:user_idchỉ được liệt kê một lần trong đầu ra choSELECT *, trái ngược với khi tham gia vớiON. Nhiều khách hàng thậm chí không chấp nhận các tên cột trùng lặp trong đầu ra.