2009-07-29 34 views
6

Tôi thấy điều này ở các tài liệu Kohana:Một truy vấn bù đắp là gì?

$content = new View('pages/items'); 
$items = new Items_Model; 

$content->items = $items->get_items($page_no, 10); // page to get starting at offset, number of items to get 

Như bạn có thể thấy, chúng ta có thể giả định rằng chúng ta có phương pháp get_items cho mô hình Các mặt hàng nhận được 2 thông số, $ page_no và 10 (như trình bày ở đây). Tôi biết rằng 10 là số hạng mục cần lấy và $ page_no là trang để bắt đầu tại offset

Tôi có thể triển khai câu lệnh sql giới hạn cho tham số 10, nhưng câu lệnh sql nào tương ứng với $ page_no? không Kohana có ý nghĩa gì liên quan đến "trang để bắt đầu bù đắp"

Trả lời

11

Nó tương ứng với một tuyên bố LIMIT:

SELECT something FROM table LIMIT $limit OFFSET $offset; 

//or alternatively 
SELECT something FROM table LIMIT $offset,$limit; 

Nói cách khác, chọn một cái gì đó từ bảng, nhưng chỉ cho tôi $limit hồ sơ bắt đầu từ hồ sơ $offset.

$offset = ($page_no - 1) * $limit
$page_no là 1 căn cứ.

Xem thêm thông tin trong tài liệu MySQL:

12.2.8 SELECT Syntax

DISCLAMER:$limit$offset được sử dụng trong câu hỏi này chỉ để hỗ trợ sự hiểu biết. Tất nhiên, bạn không muốn xây dựng một truy vấn mà không có giá trị thích hợp thoát.

+0

bạn cũng có thể muốn nhân số trang với số lượng giới hạn, để có được hành vi phân trang rõ ràng, nếu không, bạn chỉ bỏ qua các hàng đơn lẻ thay vì trang kích thước khối của hàng. – SingleNegationElimination

5

Nhận xét cụ thể đó không may lẫn lộn hai cách phổ biến để xem xét phân trang hoặc nhóm trong truy vấn. Cú pháp SELECT, như Andrew mô tả, cho phép OFFSET parameter, số lượng mục cần bỏ qua trước khi trả về bất kỳ thứ gì. Tuy nhiên, nó thường được sử dụng với phân trang, như trong các pagination library mà từ đó báo giá của bạn đã được thực hiện. Trong trường hợp này, sẽ hữu ích khi yêu cầu một số trang cụ thể.

Để so sánh hai, hãy xem xét trường hợp bạn đã thực hiện tìm kiếm và chuyển đến trang 3, với 10 mục mỗi trang. Các mục 1-20 nằm trên hai trang đầu tiên; Vì vậy, tham số OFFSET sẽ là 20:

SELECT * FROM table WHERE searched LIMIT 10 OFFSET 20 

hoặc

SELECT * FROM table WHERE searched LIMIT 20,10 

Thật không may, $page_no tham số trong ví dụ trích dẫn lẽ muốn trở thành 3, số trang. Trong trường hợp đó, bù đắp SQL sẽ phải được tính toán. Cho rằng get_items dường như không phải là một phương pháp mô hình chuẩn, nó có thể được tính toán trong đó; cách khác, các thư viện pagination dường như có một tài sản gọi là sql_offset mà có thể tính toán nó cho bạn. Dù bằng cách nào, việc tính toán cũng đủ dễ dàng:

$offset = max($page_no - 1, 0) * $limit; 
Các vấn đề liên quan