Bạn phải chỉ định SQL_CALC_FOUND_ROWS
trên SELECT
đầu tiên trong chỉ UNION
; bạn thực sự không cần truy vấn bên ngoài SELECT
như bạn làm khi sử dụng COUNT(*)
.
Bằng một ví dụ, giả sử chúng ta có truy vấn sau đây LIMIT
ed:
SELECT * FROM my_table1
UNION ALL
SELECT * FROM my_table2
UNION ALL
SELECT * FROM my_table3
LIMIT 0,10;
Chúng tôi chỉ có thể viết:
SELECT SQL_CALC_FOUND_ROWS * FROM my_table1
UNION ALL
SELECT * FROM my_table2
UNION ALL
SELECT * FROM my_table3
LIMIT 0,10;
Sau đó chúng tôi gọi:
SELECT FOUND_ROWS();
này tránh một số chi phí của việc có truy vấn bên ngoài được đề cập trong câu hỏi của bạn và trong các ý kiến của J Câu trả lời của Stefanelli (mặc dù tôi không hoàn toàn tin rằng nó sẽ là một sự khác biệt đáng chú ý).
Tôi nghĩ rằng nó có giá trị tái lặp lại rằng này sẽ chỉ làm việc nếu bạn đang sử dụng UNION ALL
hơn UNION
- Đây là vì số lượng hàng được tính toán trước khi bản sao được loại bỏ, có nghĩa là bạn sẽ nhận được kết quả tương tự từ FOUND_ROWS()
như bạn đã làm nếu bạn đã sử dụng UNION ALL
.
có vấn đề gì với giải pháp của bạn? –