すべての結果をテーブルに表示するが、テーブルの先頭から5だけオフセットされているクエリを作成したいと思います。私の知る限り、MySQLにLIMIT
はオフセットと同様に制限が必要です。これを行う方法はありますか?
limit 5000, 18446744073709551615
。コードをきれいに見せるためだけに、追加の5000行をフェッチすることはありません。
すべての結果をテーブルに表示するが、テーブルの先頭から5だけオフセットされているクエリを作成したいと思います。私の知る限り、MySQLにLIMIT
はオフセットと同様に制限が必要です。これを行う方法はありますか?
limit 5000, 18446744073709551615
。コードをきれいに見せるためだけに、追加の5000行をフェッチすることはありません。
回答:
特定のオフセットから結果セットの最後までのすべての行を取得するには、2番目のパラメーターに大きな数を使用できます。次のステートメントは、96行目から最後のすべての行を取得します。
SELECT * FROM tbl LIMIT 95, 18446744073709551615;
Limit -1
またはLimit Null
かなり合理的に見えます!または少なくともLimitは次のようなサブクエリを受け入れる必要がありますselect * from table limit (select count(*) from table)
他の回答で述べたように、MySQLは制限内のレコード数として18446744073709551615を使用することを推奨していますが、これを考慮してください。実際、1,000,000,000件のレコードを取得したらどうしますか?
10億以上のレコードが必要な場合もありますが、私の指摘では、必要な数には制限があり、18兆未満です。安定性、最適化、そしておそらく使いやすさのために、クエリに意味のある制限を設けることをお勧めします。これにより、その魔法のような数を見たことがない人の混乱も減り、少なくとも一度に処理するレコード数を伝えるという追加の利点があります。
データベースから18兆のレコードをすべて取得する必要がある場合、1億単位でそれらを取得し、1840億回ループすることが本当に必要な場合があります。
別のアプローチは、自動インクリメントされた列を選択し、HAVINGを使用してそれをフィルタリングすることです。
SET @a := 0;
select @a:=@a + 1 AS counter, table.* FROM table
HAVING counter > 4
しかし、私はおそらく上限のアプローチに固執するでしょう。
$sql = 'SET @a :=0 SELECT .....';
他の人が述べたように、MySQLマニュアルから。これを実現するために、符号なしbig intの最大値、つまりこのひどい数値(18446744073709551615)を使用できます。しかし、少し面倒を少なくするために、チルド "〜"ビット演算子を使用できます。
LIMIT 95, ~0
ビット単位の否定として機能します。「〜0」の結果は18446744073709551615です。
LIMIT 5, ~0
し、LIMIT ~0 OFFSET 5
これは、MySQL 8.0の機能です。?
ちょうど今日、mysqlテーブルから膨大な量のデータ(100万行以上)を取得する最良の方法について読んでいました。提案されているように、1つの方法は、LIMIT x,y
where を使用しx
て、オフセットとy
、返される最後の行を指定することです。しかし、私が知ったように、それはそうするための最も効率的な方法ではありません。自動インクリメント列がある場合は、どのレコードから開始するかSELECT
を指定するWHERE
句を含むステートメントを簡単に使用できます。
例えば、
SELECT * FROM table_name WHERE id > x;
mysqlは使用時にすべての結果を取得LIMIT
し、オフセットに収まるレコードのみを表示するようです。パフォーマンスには最適ではありません。
出典:この質問への回答MySQLフォーラム。注意してください、質問は約6歳です。
MySQLステートメントをLIMITで使用できます。
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がステートメントの実行で考慮されるテーブルと一致していることを確認します。
これは古いことはわかっていますが、同様の応答が見られなかったので、これが私が使用するソリューションです。
まず、テーブルでカウントクエリを実行して、レコードの数を確認します。このクエリは高速で、通常、実行時間はごくわずかです。何かのようなもの:
SELECT COUNT(*) FROM table_name;
次に、countから取得した結果を制限として使用してクエリを作成します(これは、テーブルが返す可能性のある最大行数であるため)。何かのようなもの:
SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;
またはおそらく次のようなもの:
SELECT * FROM table_name LIMIT desired_offset, count_result;
もちろん、必要に応じて、count_resultからdesired_offsetを差し引いて、実際の正確な値を取得し、制限として指定できます。提供する適切な制限を実際に決定できる場合、「18446744073709551610」の値を渡しても意味がありません。
WHERE .... AND id > <YOUROFFSET>
idは、自動インクリメントまたは一意の数値列にすることができます...