2009-07-29 11 views
6

vi esto en la documentación Kohana:¿Qué es un desplazamiento de consulta?

$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 

Como se puede ver, se puede suponer que tenemos get_items método para el modelo de objetos que recibe 2 parámetros, $ page_no y 10 (como se muestra aquí). Sé que 10 es el número de elementos para obtener y $ page_no es la página para comenzar en el desplazamiento

Probablemente pueda implementar un límite de declaración sql para el parámetro 10, pero ¿qué instrucción sql corresponderá a $ page_no? ¿Qué significa Kohana respecto a la "página para obtener comenzando en el desplazamiento"

Respuesta

11

Corresponde a una declaración LIMIT:

SELECT something FROM table LIMIT $limit OFFSET $offset; 

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

En otras palabras, seleccionar algo de la mesa, pero sólo dame $limit registros a partir de registro $offset.

$offset = ($page_no - 1) * $limit
$page_no se basa 1.

Más información en la documentación de MySQL:

12.2.8 SELECT Syntax

Disclamer:$limit y $offset se utiliza en esta pregunta sólo para ayudar a la comprensión. Por supuesto, no desea generar una consulta sin un valor de escape adecuado.

+0

también puede que quiera multiplicar el número de página en realidad por la cantidad límite, para obtener el comportamiento de paginación obvio, de lo contrario, sólo se está saltando filas individuales, en lugar de página- tamaño de trozos de filas. – SingleNegationElimination

5

Desafortunadamente, ese comentario particular confunde dos formas comunes de considerar la paginación o la agrupación en las consultas. La sintaxis SELECT, como lo describe Andrew, permite un OFFSET parameter, la cantidad de elementos que se deben omitir antes de devolver algo. Sin embargo, se utiliza con más frecuencia con la paginación, como en el pagination library del cual se tomó su cotización. En este caso, es más útil solicitar un número de página específico.

Para comparar los dos, considere un caso en el que ha realizado una búsqueda y ha ido a la página 3, con 10 elementos por página. Los artículos 1-20 estaban en las primeras dos páginas; Por lo tanto, el parámetro OFFSET será 20:

SELECT * FROM table WHERE searched LIMIT 10 OFFSET 20 

o

SELECT * FROM table WHERE searched LIMIT 20,10 

Por desgracia, el parámetro $page_no en el ejemplo citado, probablemente quiere ser 3, el número de página. En ese caso, el desplazamiento de SQL tendrá que calcularse. Dado que get_items no parece ser un método modelo estándar, probablemente se calcule allí; alternativamente, la biblioteca de paginación parece tener una propiedad llamada sql_offset que probablemente la calcule. De cualquier manera, el cálculo es bastante fácil:

$offset = max($page_no - 1, 0) * $limit; 
Cuestiones relacionadas