Utiliser une variable dans une clause LIMIT dans MySQL
Question
J'écris une procédure stockée dans laquelle j'ai un paramètre d'entrée appelé my_size qui est un INTEGER . Je veux pouvoir l'utiliser dans une clause LIMIT
dans une instruction SELECT
. Apparemment, cela n’est pas supporté. Y at-il un moyen de contourner ce problème?
# I want something like:
SELECT * FROM some_table LIMIT my_size;
# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
La solution
Une recherche a révélé cet article . J'ai collé le texte pertinent ci-dessous.
Voici un article de forum montrant un exemple de déclarations préparées laissant vous affectez une valeur de variable à la clause limit:
http://forums.mysql.com/read. php? 98,126379,133966 # msg-133966
Cependant, je pense que ce bug devrait attirer l'attention car je ne peux pas imaginez que les déclarations préparées au cours d’une procédure permettent optimisations au moment de la compilation des procédures. J'ai un 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 La clause peut accepter des variables de procédure normales (par exemple, une procédure argument), la base de données peut toujours effectuer la compilation optimisations sur le reste de la requête, au sein de la procédure. Ce probablement permettre une exécution plus rapide de la procédure. Je ne suis pas un expert bien que.
Autres conseils
Pour ceux qui ne peuvent pas utiliser MySQL 5.5.6+ et ne veulent pas écrire de procédure stockée, il existe une autre variante. Nous pouvons ajouter la clause where sur une sous-sélection 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;
Cette fonctionnalité a été ajoutée à MySQL 5.5.6. Consultez ce lien sur.
Je suis passé à MySQL 5.5 uniquement pour cette fonctionnalité et fonctionne très bien. La version 5.5 dispose également de nombreuses améliorations de performances et je le recommande tout à fait.
Une autre façon, identique à celle écrite "Pradeep Sanjaya", mais en utilisant 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;
A partir de la version 5.5.6 de MySQL, vous pouvez spécifier LIMIT
et OFFSET
avec des variables / paramètres.
Pour référence, consultez le Manuel 5.5. , le Manuel 5.6 et @ Quassnoi's réponse