Utilizzo della variabile in una clausola LIMIT in MySQL
Domanda
Sto scrivendo una procedura memorizzata in cui ho un parametro di input chiamato my_size che è un INTEGER . Voglio essere in grado di usarlo in una clausola LIMIT
in un'istruzione SELECT
. Apparentemente questo non è supportato, c'è un modo per aggirare questo?
# I want something like:
SELECT * FROM some_table LIMIT my_size;
# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
Soluzione
È stata trovata una ricerca questo articolo . Ho incollato il testo pertinente di seguito.
Ecco un post sul forum che mostra un esempio di dichiarazioni preparate si assegna un valore variabile alla clausola limite:
http://forums.mysql.com/read. php? 98,126379,133966 # msg-133.966
Tuttavia, penso che questo errore dovrebbe attirare l'attenzione perché non posso immagina che le dichiarazioni preparate all'interno di una procedura consentano qualsiasi ottimizzazioni in fase di compilazione delle procedure. Ho la sensazione che preparato le istruzioni vengono compilate ed eseguite durante l'esecuzione della procedura, quale probaby ha un impatto negativo sull'efficienza. Se il limite la clausola potrebbe accettare le normali variabili di procedura (diciamo, una procedura argomento), quindi il database potrebbe ancora eseguire il tempo di compilazione ottimizzazioni sul resto della query, all'interno della procedura. Questo produrrebbe probabilmente un'esecuzione più rapida della procedura. Non sono un esperto però.
Altri suggerimenti
Per coloro che non possono usare MySQL 5.5.6+ e non vogliono scrivere una procedura memorizzata, esiste un'altra variante. Possiamo aggiungere la clausola where su una sottoselezione con ROWNUM.
SET @limit = 10;
SELECT * FROM (
SELECT instances.*,
@rownum := @rownum + 1 AS rank
FROM instances,
(SELECT @rownum := 0) r
) d WHERE rank < @limit;
PROCEDURA MEMORIZZATA
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 ;
Utilizzo
call get_users(1, 10);
So che questa risposta è arrivata in ritardo, ma prova SQL_SELECT_LIMIT.
Esempio:
Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;
Questa funzione è stata aggiunta a MySQL 5.5.6. Dai un'occhiata a questo link .
Ho eseguito l'aggiornamento a MySQL 5.5 solo per questa funzione e funziona benissimo. 5.5 ha anche molti aggiornamenti delle prestazioni in atto e lo consiglio vivamente.
Un altro modo, lo stesso di quello scritto "Pradeep Sanjaya", ma 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;
A partire dalla versione 5.5.6 di MySQL, puoi specificare LIMIT
e OFFSET
con variabili / parametri.
Per riferimento, consultare il Manuale 5.5 , il 5.6 Manual e @ Quassnoi's rispondere