2016-01-02 19 views
5

Tôi đang làm một trang tìm kiếm để tìm người dùng. Tôi có truy vấn que để tìm chúng và thực sự tôi có thể làm việc phân trang với "LIMIT startRow, numberRows". Nhưng làm cách nào tôi có thể đếm tổng số "đăng ký" được tìm thấy trước khi thực hiện phân trang? Tôi muốn thêm vào trang tìm kiếm của mình, số lượng người dùng được tìm thấy trong tìm kiếm.MySQL - Cách đếm các hàng trước khi phân trang?

Tôi cần một cái gì đó như: "Trang 1/100". Tôi thực sự tôi có "Trang 1" nhưng tôi không biết làm thế nào để đếm tổng số kết quả trước khi phân trang.

¿Có thể cần phải thực hiện truy vấn bổ sung bằng "SELECT COUNT (*)"? ¿Có cách nào khác để đếm trước khi phân trang để tránh truy vấn khác không?

tôi sử dụng hai truy vấn sql, một cho từ duy nhất, và một cho nhiều từ:

truy vấn cơ sở sql (đối với từ duy nhất và tìm kiếm đa từ):

"SELECT * FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id " 

Độc trạng từ:

"WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?" 

trạng từ đa:

"WHERE CONCAT(P.name, ' ', P.surname) LIKE ? LIMIT ?,?" 

Cảm ơn rất nhiều.

+0

Có một số lý do bạn không thể sử dụng [displaytag] (http://www.displaytag.org/1.2/)? –

+0

Tôi không biết về thư viện đó. Có vẻ thú vị cho một phương pháp tìm kiếm khác mà tôi sẽ cần. Mặc dù điều này tôi muốn biết về để đếm tổng số kết quả trước khi phân trang, bởi vì tôi đang học. Cảm ơn bạn. – wilmerlpr

Trả lời

2

Sửa đổi các truy vấn như thế này:

SELECT SQL_CALC_FOUND_ROWS * FROM accounts ... LIMIT ... 

này sẽ trả lại hạn chế kết quả tương tự/bù đắp như trước (trang đầu tiên của kết quả, ví dụ), nhưng nếu bạn sau đó ngay lập tức gửi truy vấn thứ hai này với máy chủ ...

SELECT FOUND_ROWS(); 

Máy chủ sẽ trả về tổng số hàng đã trả về nếu LIMIT không được áp dụng cho truy vấn trước đó. Có tổng số kết quả của bạn. Điều này sẽ, tất nhiên, có nghĩa là truy vấn ban đầu của bạn mất nhiều thời gian hơn, bởi vì trình tối ưu hóa không thể thực hiện bất kỳ lối tắt nào có thể cho phép nó ngừng đánh giá các hàng sau khi đáp ứng được LIMIT, nhưng trong một số trường hợp, không có lối tắt nào như vậy có sẵn.

Đây là cơ chế "chính thức" để thực hiện những gì bạn đang cố gắng hoàn thành.

http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows

+1

Cuối cùng! Nó hoạt động như tôi đã được sp ecting. Truy vấn nhỏ mà không tốn nhiều tài nguyên với bộ lọc "thích". Cảm ơn câu trả lời của bạn. – wilmerlpr

0

Bạn có thể sử dụng làm điều gì đó như thế này:

SELECT (select count(*) from produtos) as counter, column1, column2, column3, column4 FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?; 

Thay vì chọn tất cả (*), bạn sử dụng mỗi tên cột, và tạo ra một cột gọi là truy cập.

+0

Nó chỉ hiển thị tổng số mục nhập trong cơ sở dữ liệu bỏ qua bộ lọc "WHERE". Nếu tôi đổi nó thành "SELECT COUNT (*) AS total, column2, ..."nó cho thấy số hàng phù hợp với bộ lọc" WHERE ", nhưng kết quả của mysql chỉ có một hàng là truy vấn đầu tiên và nó cũng có tổng số" tổng "mới mà trên thực tế, có số – wilmerlpr

+0

Điều gì về điều này? CHỌN (chọn số (*) từ tài khoản NHƯ MỘT ĐỐI TÁC ĐỐI TÁC NHƯ THẾ NÀO NHƯ P ON A.account_id = P.account_id Ở ĐÂU A.username HOẶC P.name LIKE? HOẶC P.name LIKE? HOẶC P.surname LIKE? HOẶC P.surname LIKE?) Như truy cập, column1, column2, column3, column4 TỪ tài khoản NHƯ MỘT MẪU ĐỐI TÁC ĐỐI TÁC NHƯ P ON A.account_id = P.account_id WHERE A.username LIKE HOẶC P.name LIKE? HOẶC P.name LIKE? HOẶC P.surname LIKE? HOẶC P.surname LIKE? LIMIT?,? Loại truy vấn lớn, có thể được cải thiện, nhưng tôi hy vọng nó sẽ giúp :) –

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