mysql variables limit clause

Cláusula LIMIT variable en MySQL



variables clause (7)

A partir de MySQL versión 5.5.6, puede especificar LIMIT y OFFSET con variables / parámetros.

Como referencia, consulte el Manual 5.5 , el Manual 5.6 y la answer @ Quassnoi

Estoy escribiendo un procedimiento almacenado donde tengo un parámetro de entrada llamado my_size que es un int, quiero poder usar en una cláusula de límite en una instrucción select. Aparentemente esto no es compatible, ¿hay alguna forma de evitar esto?

# I want something like: SELECT * FROM some_table LIMIT my_size; # Instead of hardcoding a permanent limit: SELECT * FROM some_table LIMIT 100;


Esta característica se ha agregado a MySQL 5.5.6. Verifique este bugs.mysql.com/bug.php?id=11918 .

Me actualicé a MySQL 5.5 solo para esta característica y funciona muy bien. 5.5 también tiene muchas mejoras de rendimiento implementadas y lo recomiendo totalmente.


Otra forma, la misma que escribió "Pradeep Sanjaya", pero usando CONCAT:

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT) READS SQL DATA COMMENT ''example'' BEGIN SET @asd = CONCAT(''SELECT `id` FROM `table` LIMIT '',startIndex,'','',countNum); PREPARE zxc FROM @asd; EXECUTE zxc; END;


Para aquellos que no pueden usar MySQL 5.5.6+ y no desean escribir un procedimiento almacenado, existe otra variante. Podemos agregar where cláusula en una subselección con ROWNUM.

SET @limit = 10; SELECT * FROM ( SELECT instances.*, @rownum := @rownum + 1 AS rank FROM instances, (SELECT @rownum := 0) r ) d WHERE rank < @limit;


Sé que esta respuesta ha llegado tarde, pero prueba SQL_SELECT_LIMIT.

Ejemplo:

Declare rowCount int; Set rowCount = 100; Set SQL_SELECT_LIMIT = rowCount; Select blah blah Set SQL_SELECT_LIMIT = Default;


Una búsqueda apareció en este artículo . He pegado el texto relevante a continuación.

Aquí hay una publicación en el foro que muestra un ejemplo de declaraciones preparadas que le permiten asignar un valor variable a la cláusula límite:

http://forums.mysql.com/read.php?98,126379,133966#msg-133966

Sin embargo, creo que este error debería llamar la atención porque no puedo imaginar que las declaraciones preparadas dentro de un procedimiento permitan cualquier optimización de tiempo de compilación de procedimiento. Tengo la sensación de que las declaraciones preparadas se compilan y se ejecutan en el tiempo de ejecución del procedimiento, lo que probablemente tiene un impacto negativo en la eficiencia. Si la cláusula de límite podría aceptar variables de procedimiento normales (por ejemplo, un argumento de procedimiento), entonces la base de datos aún podría realizar optimizaciones de tiempo de compilación en el resto de la consulta, dentro del procedimiento. Esto probablemente produzca una ejecución más rápida del procedimiento. No soy un experto sin embargo.


PROCEDIMIENTO ALMACENADO

DELIMITER $ create PROCEDURE get_users(page_from INT, page_size INT) begin SET @_page_from = page_from; SET @_page_size = page_size; PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;"; EXECUTE stmt USING @_page_from, @_page_size; DEALLOCATE PREPARE stmt; end$ DELIMITER ;

USO

call get_users(1, 10);