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
AS
chỉ 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
FROM
cá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 LAST
thay 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 BY
như 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ápUSING
trong 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_id
chỉ đượ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.