Utilisation de la variable dans une clause limite dans MySQL
j'écris une procédure stockée où j'ai un paramètre d'entrée appelé my_size c'est un entier. Je veux être capable de l'utiliser dans un LIMIT
clause SELECT
déclaration. Apparemment ce n'est pas pris en charge, est-il un moyen de contourner cela?
# I want something like:
SELECT * FROM some_table LIMIT my_size;
# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
7 réponses
Une recherche tourné vers le haut cet article. J'ai collé le texte correspondant ci-dessous.
voici un billet de forum montrant un exemple de déclarations préparées laissant vous assignez une valeur variable à la clause limite:
http://forums.mysql.com/read.php?98,126379, 133966#msg-133966
cependant, je pense que ce bug devrait attirer l'attention parce que je ne peux pas imaginez que des déclarations préparées dans le cadre d'une procédure permettront pour tout procédure-optimisation du temps de compilation. J'ai le sentiment que préparé les instructions sont compilées et exécutées à l'exécution de la procédure, qui probaby a un impact négatif sur l'efficacité. Si la limite clause pourrait accepter les variables de procédure normale (par exemple, une procédure argument), alors la base de données pourrait encore effectuer le temps de compilation des optimisations sur le reste de la requête, au sein de la procédure. Ce cela permettrait probablement une exécution plus rapide de la procédure. Je ne suis pas expert bien.
pour ceux qui ne peuvent pas utiliser MySQL 5.5.6+ et ne veulent pas écrire une procédure stockée, il y a une autre variante. Nous pouvons ajouter une clause où sur un sous-Select avec ROWNUM.
SET @limit = 10;
SELECT * FROM (
SELECT instances.*,
@rownum := @rownum + 1 AS rank
FROM instances,
(SELECT @rownum := 0) r
) d WHERE rank < @limit;
PROCÉDURE STOCKÉE
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 ;
USAGE
call get_users(1, 10);
je sais que cette réponse est arrivée en retard, mais essayez SQL_SELECT_LIMIT.
Exemple:
Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;
une Autre façon, la même qui a écrit "Pradeep Sanjaya", mais en utilisant la concaténation:
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;
LIMIT
et OFFSET
Avec variables / paramètres.
Pour référence, voir le 5.5 Manuel, le 5.6 Manuel et @Quassnoi réponse