web-dev-qa-db-ja.com

MySQLオフセット無限行

テーブル内のすべての結果を表示するクエリを作成したいのですが、テーブルの先頭から5オフセットされています。私の知る限り、MySQLのLIMITにはオフセットと同様に制限が必要です。これを行う方法はありますか?

101
stillinbeta

LIMITのMySQLマニュアル から:

特定のオフセットから結果セットの最後までのすべての行を取得するには、2番目のパラメーターに大きな数を使用できます。次のステートメントは、96行目から最後の行までのすべての行を取得します。

SELECT * FROM tbl LIMIT 95, 18446744073709551615;
140
Greg

既に述べたように、LIMITは必須であるため、可能な限り最大の制限である18446744073709551615(符号なしBIGINTの最大値)を使用する必要があります

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5
22
Czimi

他の回答に記載されているように、MySQLは制限内のレコード数として18446744073709551615を使用することを提案していますが、これを考慮してください。実際、1,000,000,000レコードを取得したらどうしますか?

たぶん、あなたは10億以上のレコードが欲しいのですが、私のポイントは、あなたがwantに数の制限があるということであり、それは18クインティオン未満です。安定性、最適化、そしておそらく使いやすさのために、クエリに意味のある制限を設けることをお勧めします。これはまた、その魔法のような数字を見たことがない人の混乱を減らし、少なくとも一度に処理するレコードの数を伝えるという追加の利点があります。

データベースから18のすべてのレコードを取得する必要がある場合、1億単位で取得し、1840億回ループすることが本当に必要な場合があります。

7
cesoid

別のアプローチは、自動増分された列を選択し、HAVINGを使用してフィルタリングすることです。

SET @a := 0; 
select @a:=@a + 1 AS counter, table.* FROM table 
HAVING counter > 4

しかし、おそらく上限アプローチに固執するでしょう。

5
jishi

ちょうど今日、mysqlテーブルから大量のデータ(100万行以上)を取得する最良の方法について読んでいました。 1つの方法は、提案されているように、LIMIT x,yここで、xはオフセットで、yは返される最後の行です。しかし、私が知ったように、それはそうするための最も効率的な方法ではありません。自動インクリメント列がある場合、SELECT文をWHERE句とともに使用して、どのレコードから開始するかを簡単に使用できます。

例えば、 SELECT * FROM table_name WHERE id > x;

MysqlはLIMITを使用するとすべての結果を取得し、オフセットに収まるレコードのみを表示するようです。パフォーマンスには最適ではありません。

出典:この質問への回答 MySQL Forums 。注意してください、質問は約6歳です。

0
fed

LIMITでMySQLステートメントを使用できます。

START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;

MySQL 5.5.44でテスト済み。したがって、番号18446744073709551615の挿入を回避できます。

注:トランザクションは、変数@rowsがステートメントの実行で考慮されるテーブルと一致することを確認します。

0
sissi_luaty