質問

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;

MySQLバージョン5.5.6では、変数/パラメーターで LIMIT および OFFSET を指定できます。

参照については、 5.5マニュアルをご覧ください。 、 5.6マニュアルおよび@Quassnoiの回答

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top