2012-07-30 26 views
5

Quiero obtener mis resultados una 'página' a la vez; Quiero que el número de página sea un parámetro (en una declaración preparada por JDBC). Considere el siguiente fragmentoUse LIMIT para paginar los resultados en la consulta de MySQL

SELECT * FROM thread t ORDER BY t.id LIMIT ((? - 1) * 20), 20 

Así que lo ideal, esto daría lugar, por la página 1, a LIMIT 0, 20.

Cuando la prueba

SELECT * FROM thread t ORDER BY t.id LIMIT ((1 - 1) * 20), 20 

Me han dicho que tengo un error de sintaxis. Aunque no veo lo que podría ser, es solo una matemática simple. Todo lo que me dice es

ERROR 1064 (42000): Tiene un error en la sintaxis SQL; consulte el manual que corresponde a su versión del servidor MySQL para el sintaxis derecho al uso cerca '((1 - 1) * 20), 20' en la línea 1

¿qué estoy haciendo mal con mi cláusula de LIMIT ¿y cómo puedo solucionarlo?

Respuesta

7

MySQL requiere constantes numéricas para esa sintaxis de LIMIT.

De http://dev.mysql.com/doc/refman/5.7/en/select.html:

La cláusula LIMIT puede usarse para limitar el número de filas devueltas por la instrucción SELECT. LIMIT toma uno o dos argumentos numéricos, que debe ser a la vez constantes entero no negativo, con las siguientes excepciones:

  • Dentro de declaraciones preparadas, los parámetros de límite puede ser especificados usando? marcadores de marcador de posición.

  • Dentro de los programas almacenados, los parámetros LIMIT se pueden especificar usando parámetros de rutina de valores enteros o variables locales.

Calcular la constante en el lado de Java.

+1

por lo que no puede evaluar '((1-1) * 20)' como una constante, a pesar de que consiste en nada más constantes ? Eso parece una limitación extraña. Pensé que se consideraba una constante, ya que no contenía ninguna variable ... ¡pero al menos sé qué hacer ahora! Gracias. – corsiKa

+0

Sí, matemáticamente hablando, estás representando una "constante" ((1-1) * 20 es siempre la misma) ... pero desde la perspectiva del analizador, MySQL no está en un estado de análisis de expresión matemática :) – Matt

+2

Acabo de reemplazar el código ofensivo con 'limit?, 20' y usando' pageStart = (page - 1) * 20; 'y funcionó como un amuleto. Ahora en el siguiente error :) – corsiKa

11

Esto no se puede hacer.

Ver solución aquí: MySQL Math and COUNT(*) in LIMIT

Yo recomendaría el uso de javascript o algo para manejar el primer parámetro (es decir, offset), tales como: limit 0,20 en la primera página y en el segundo limit 21,20 ...

Para ejemplo, si su primera página tiene una variable se interponen en el www.example.com?page=1 url

offset = (page - 1)*20 ; 
row_count = 20; 
select * from table limit (offset, row_count); 
+0

de manera óptima, podrías usar algo como esto. El código es mucho más rápido que dos consultas donde tendrías que hacer un recuento de la tabla y luego usar ese resultado de recuento como tus nuevos parámetros debido al potencial de n cantidad de filas en tu tabla ... Cuanto más grande sea la tabla, menos las consultas eficientes serán – Shawn

4

Definir Offset para el consulta.

Por ejemplo

si quieres page-1 (1-10) registros de desplazamiento = 0, límite = 10; para la página-2 (registros 11-20) desplazamiento = 20, límite = 10; y utilizar la siguiente consulta:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset}; 

ejemplo:

SELECT column FROM table 
LIMIT 10 OFFSET 10; 
Cuestiones relacionadas