MySQLのLIMIT句で変数を使用する
質問
integer である my_size という入力パラメータがあるストアドプロシージャを書いています。 SELECT
ステートメントの LIMIT
句で使用できるようにします。どうやらこれはサポートされていませんが、これを回避する方法はありますか?
# 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 ;
使用法
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に追加されました。 リンクをご覧ください。
この機能のために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;