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;
34
demandé sur informatik01 2008-10-29 01:55:06

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.

9
répondu TheSoftwareJedi 2013-05-24 17:55:41

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;
20
répondu ENargit 2013-06-12 06:58:08

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);
13
répondu Pradeep Sanjaya 2012-04-05 08:54:37

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;
12
répondu user888112 2011-08-13 16:38:48

cette fonctionnalité a été ajoutée à MySQL 5.5.6. Cochez cette lien.

J'ai mis à jour à MySQL 5.5 juste pour cette fonctionnalité et fonctionne très bien. 5.5 a également beaucoup de mises à niveau de performance en place et je le recommande totalement.

8
répondu Jiho Kang 2012-01-22 15:46:43

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;
2
répondu Алексей Пузенко 2013-02-13 15:08:50
LIMIT et OFFSET Avec variables / paramètres.

Pour référence, voir le 5.5 Manuel, le 5.6 Manuel et @Quassnoi réponse

1
répondu rekaszeru 2017-05-23 10:31:31