Để biết tổng số hàng thoả mãn điều kiện mà vẫn dùng LIMIT phân trang, sử dụng SQL_CALC_FOUND_ROWS kết hợp FOUND_ROWS().
Cú pháp
SELECT SQL_CALC_FOUND_ROWS * FROM ten_bang LIMIT offset, limit; SELECT FOUND_ROWS();
Ví dụ minh họa
Tạo bảng và chèn dữ liệu:
mysql> CREATE TABLE RowsUsingLimit (
-> Id INT NOT NULL,
-> Name VARCHAR(10)
-> );
mysql> INSERT INTO RowsUsingLimit VALUES(10, 'Larry');
mysql> INSERT INTO RowsUsingLimit VALUES(9, 'Mike');
mysql> INSERT INTO RowsUsingLimit VALUES(15, 'Sam');
mysql> INSERT INTO RowsUsingLimit VALUES(20, 'Bob');
mysql> INSERT INTO RowsUsingLimit VALUES(1, 'Carol');
mysql> INSERT INTO RowsUsingLimit VALUES(18, 'David');
Truy vấn với LIMIT và tính tổng:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM RowsUsingLimit LIMIT 0, 6; +----+-------+ | Id | Name | +----+-------+ | 10 | Larry | | 9 | Mike | | 15 | Sam | | 20 | Bob | | 1 | Carol | | 18 | David | +----+-------+ mysql> SELECT FOUND_ROWS(); +--------------+ | FOUND_ROWS() | +--------------+ | 6 | +--------------+
Lưu ý quan trọng
SQL_CALC_FOUND_ROWSlàm chậm truy vấn vì MySQL phải quét toàn bộ kết quả- Từ MySQL 8.0.17,
SQL_CALC_FOUND_ROWSbị deprecated (khuyến cáo không dùng) - Thay thế: Chạy 2 truy vấn riêng - một
COUNT(*)và mộtSELECT ... LIMIT - Hoặc dùng window function
COUNT(*) OVER()(MySQL 8.0+)
Cách thay thế hiện đại (MySQL 8.0+)
SELECT *, COUNT(*) OVER() AS total_rows FROM ten_bang LIMIT offset, limit;