2015-03-05 44 views
13

Đối với mục đích phân trang, tôi cần chạy truy vấn với các mệnh đề LIMITOFFSET. Nhưng tôi cũng cần một đếm số hàng đó sẽ được trả về bởi truy vấn rằng nếu không có LIMITOFFSET khoản.Chạy truy vấn có LIMIT/OFFSET và cũng nhận được tổng số hàng

Tôi muốn chạy:

SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ? 

Và:

SELECT COUNT(*) FROM table WHERE /* whatever */ 

Cùng lúc đó. Có cách nào để làm điều đó, đặc biệt là một cách mà cho phép Postgres tối ưu hóa nó, để nó nhanh hơn chạy cả hai cá nhân?

Trả lời

32

Yes. Với một hàm cửa sổ đơn giản:

SELECT *, count(*) OVER() AS full_count 
FROM tbl 
WHERE /* whatever */ 
ORDER BY col1 
LIMIT ? 
OFFSET ?

Hãy nhận biết rằng chi phí sẽ cao hơn đáng kể so với khi không tổng số, nhưng vẫn rẻ hơn so với hai truy vấn riêng biệt. Postgres có để thực sự đếm tất cả các hàng trong cả hai trường hợp, trong đó áp đặt một chi phí phụ thuộc vào tổng số lượng hàng đủ điều kiện. Thông tin chi tiết:

-4

No.

Có lẽ một số lợi ích nhỏ bạn có thể đạt được về mặt lý thuyết khi chạy chúng riêng lẻ với đủ máy móc phức tạp dưới mui xe. Nhưng, nếu bạn muốn biết có bao nhiêu hàng phù hợp với điều kiện bạn sẽ phải đếm chúng chứ không phải chỉ là một tập hợp con Limited.

Các vấn đề liên quan