my_sizeという入力パラメーターがあるストアドプロシージャを記述しています。これは[〜#〜] integer [〜#〜]です。 LIMIT
ステートメントのSELECT
句で使用できるようにしたい。これはサポートされていないようですが、これを回避する方法はありますか?
# I want something like:
SELECT * FROM some_table LIMIT my_size;
# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
検索結果が判明 この記事 。以下に関連するテキストを貼り付けました。
制限句に変数値を割り当てることができる準備済みステートメントの例を示すフォーラムの投稿は次のとおりです。
http://forums.mysql.com/read.php?98,126379,133966#msg-133966
ただし、プロシージャ内の準備済みステートメントによってプロシージャのコンパイル時の最適化が可能になるとは想像できないため、このバグに注意を払う必要があると思います。準備されたステートメントは、プロシージャの実行時にコンパイルおよび実行されると感じていますが、probabyは効率に悪影響を及ぼします。制限句が通常のプロシージャ変数(プロシージャ引数など)を受け入れることができる場合、データベースは、プロシージャ内の残りのクエリでコンパイル時の最適化を実行できます。これにより、プロシージャの実行が高速になる可能性があります。しかし、私は専門家ではありません。
MySQL 5.5.6+を使用できず、ストアドプロシージャを作成したくない人のために、別のバリアントがあります。 ROWNUMを使用して、副選択にwhere句を追加できます。
SET @limit = 10;
SELECT * FROM (
SELECT instances.*,
@rownum := @rownum + 1 AS rank
FROM instances,
(SELECT @rownum := 0) r
) d WHERE rank < @limit;
保存された手順
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);
この回答が遅れていることは知っていますが、SQL_SELECT_LIMITを試してください。
例:
Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;
この機能はMySQL 5.5.6に追加されました。これを確認してください link out。
この機能のためにMySQL 5.5にアップグレードしましたが、うまく機能します。 5.5では、多くのパフォーマンスアップグレードも実施されているため、完全に推奨しています。
別の方法、「Pradeep Sanjaya」と同じですが、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;
MySQLバージョン5.5.6以降では、LIMIT
およびOFFSET
を指定できます変数/パラメータ付き。
参照については、 5.5 Manual 、 5.6 Manual 、および@Quassnoiの answer を参照してください。