web-dev-qa-db-ja.com

MySQLのLIMIT句で変数を使用する

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;
39
MPX

検索結果が判明 この記事 。以下に関連するテキストを貼り付けました。

制限句に変数値を割り当てることができる準備済みステートメントの例を示すフォーラムの投稿は次のとおりです。

http://forums.mysql.com/read.php?98,126379,133966#msg-133966

ただし、プロシージャ内の準備済みステートメントによってプロシージャのコンパイル時の最適化が可能になるとは想像できないため、このバグに注意を払う必要があると思います。準備されたステートメントは、プロシージャの実行時にコンパイルおよび実行されると感じていますが、probabyは効率に悪影響を及ぼします。制限句が通常のプロシージャ変数(プロシージャ引数など)を受け入れることができる場合、データベースは、プロシージャ内の残りのクエリでコンパイル時の最適化を実行できます。これにより、プロシージャの実行が高速になる可能性があります。しかし、私は専門家ではありません。

10
TheSoftwareJedi

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;
22
ENargit

保存された手順

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);
14
Pradeep Sanjaya

この回答が遅れていることは知っていますが、SQL_SELECT_LIMITを試してください。

例:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;
12
user888112

この機能はMySQL 5.5.6に追加されました。これを確認してください link out。

この機能のためにMySQL 5.5にアップグレードしましたが、うまく機能します。 5.5では、多くのパフォーマンスアップグレードも実施されているため、完全に推奨しています。

9
Jiho Kang

別の方法、「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 Manual5.6 Manual 、および@Quassnoiの answer を参照してください。

1
rekaszeru