2011-01-17 17 views
6

Mysql, tôi đang sử dụng SQL_CALC_FOUND_ROWS để nhận tổng số bản ghi có thể có.
Làm cách nào để sử dụng nó trên UNION?
Điều duy nhất làm việc cho tôi ngay bây giờ, mà có vẻ hơi tắt là:Làm cách nào để triển khai SQL_CALC_FOUND_ROWS trên truy vấn với UNION?

SELECT COUNT(*) 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 

hoặc

SELECT SQL_CALC_FOUND_ROWS * 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 
+0

có vấn đề gì với giải pháp của bạn? –

Trả lời

16

Từ FOUND_ROWS() documentation:

Việc sử dụng SQL_CALC_FOUND_ROWS và FOUND_ROWS() phức tạp hơn đối với câu lệnh UNION so với câu lệnh SELECT đơn giản, vì LIMIT có thể xảy ra tại nhiều địa điểm trong UNION. Có thể là áp dụng cho các phát biểu SELECT riêng lẻ trong UNION hoặc toàn cầu đến kết quả UNION nói chung.

Mục đích của SQL_CALC_FOUND_ROWS cho UNION là nó nên trả về hàng đếm sẽ được trả lại mà không có giới hạn toàn cầu là . Điều kiện để sử dụng của SQL_CALC_FOUND_ROWS với UNION là:

  • Từ khóa SQL_CALC_FOUND_ROWS phải xuất hiện trong SELECT đầu tiên của UNION.

  • Giá trị của FOUND_ROWS() là chính xác chỉ khi UNION ALL được sử dụng. Nếu UNION mà không sử dụng TẤT CẢ, việc xóa trùng lặp xảy ra và giá trị của FOUND_ROWS() chỉ là gần đúng.

  • Nếu không LIMIT có mặt trong UNION, SQL_CALC_FOUND_ROWS bị bỏ qua và trả về số hàng trong bảng tạm thời được tạo ra để quá trình UNION.

+0

Chỉ cần làm rõ, đó là 'SELECT SQL_CALC_FOUND_ROWS * FROM ((SELECT cột FROM t1) UNION ALL (SELECT cột FROM t2)) _ut' * không *' SELECT * FROM ((SELECT SQL_CALC_FOUND_ROWS cột FROM t1) UNION ALL (SELECT cột FROM t2)) _ut' – mpen

2

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ác vấn đề liên quan