Mit Variable in einer LIMIT-Klausel in MySQL
Frage
Ich bin eine gespeicherte Prozedur zu schreiben, wo ich einen Eingabeparameter mit dem Namen my_size , die ein INTEGER ist . Ich möchte in der Lage, es in einer LIMIT
-Klausel in einer SELECT
Anweisung zu verwenden. Offenbar dies nicht unterstützt wird, gibt es eine Möglichkeit, dies zu umgehen?
# I want something like:
SELECT * FROM some_table LIMIT my_size;
# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
Lösung
Eine Suche aufgedreht diesem Artikel href="http://bugs.mysql.com/bug.php?id=8094". Ich habe den entsprechenden Text eingefügt.
Hier ist ein Forum Post ein Beispiel für vorbereitete Anweisungen zeigen lassen Sie weisen Sie einen variablen Wert auf die limit-Klausel:
http://forums.mysql.com/read. php? 98,126379,133966 # msg-133966
Aber ich denke, sollte dieser Fehler etwas Aufmerksamkeit bekommen, weil ich kann nicht vorstellen, dass vorbereitete Anweisungen in einer Prozedur für jeden ermöglichen Verfahren-Kompilierung-Optimierungen. Ich habe das Gefühl, die vorbereitet Aussagen zusammengestellt und zur Laufzeit des Verfahrens ausgeführt, was sich probaby eine negative Auswirkung auf die Effizienz. Wenn die Grenze Klausel könnte normale Prozedur Variablen annehmen (beispielsweise ein Verfahren, Argument), dann könnte die Datenbank noch Compile-Zeit durchführen Optimierungen auf dem Rest der Abfrage innerhalb der Prozedur. Diese ergeben würde wahrscheinlich eine schnellere Ausführung des Verfahrens. Ich bin kein Experte though.
Andere Tipps
Für diejenigen, die nicht MySQL verwenden können 5.5.6+ und wollen nicht eine gespeicherte Prozedur schreiben, gibt es eine weitere Variante. Wir können where-Klausel auf einem subselect mit ROWNUM hinzuzufügen.
SET @limit = 10;
SELECT * FROM (
SELECT instances.*,
@rownum := @rownum + 1 AS rank
FROM instances,
(SELECT @rownum := 0) r
) d WHERE rank < @limit;
Stored Procedure
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 ;
VERWENDUNG
call get_users(1, 10);
Ich weiß, diese Antwort zu spät gekommen, aber versuchen SQL_SELECT_LIMIT.
Beispiel:
Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;
Diese Funktion wurde in MySQL 5.5.6 hinzugefügt. Aktivieren Sie diese Option Link aus.
Ich habe 5.5 nur für diese Funktion zu MySQL aktualisiert und funktioniert super. 5.5 auch viele Performance-Upgrades an Ort und Stelle hat und ich es sehr empfehlen.
Eine andere Möglichkeit, die gleiche wie schrieb "Pradeep Sanjaya", aber unter Verwendung von 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;
Ab MySQL-Version 5.5.6 können Sie angeben, LIMIT
und OFFSET
mit Variablen / Parameter.
Als Referenz finden Sie in der 5.5 Handbuch rel="nofollow , 5.6 Handbuch und @ Quassnoi der beantworten