90

重複の可能性:
オフセット + 制限を使用して mySQL クエリの結果の合計数を見つける

ページ分割された結果を返す非常に複雑な SQL クエリがあります。問題は、SQL クエリを 2 回実行する必要がある LIMIT の前に合計行数を取得することです。合計行数を取得するための limit 句なしの初回。SQLクエリは非常に複雑で、クエリを2回実行せずにこれを行うためのより良い方法であるに違いないと思います.

4

1 に答える 1

117

幸いなことに、MySQL 4.0.0 以降、クエリでオプションを使用して、MySQL に句SQL_CALC_FOUND_ROWSを無視して行の総数をカウントするように指示できます。LIMIT行数を取得するために 2 つ目のクエリを実行する必要がありますが、これは単純なクエリであり、データを取得したクエリほど複雑ではありません。使い方はとても簡単です。メインクエリでは、SQL_CALC_FOUND_ROWS直後にオプションを追加する必要SELECTがあり、2 番目のクエリでは、FOUND_ROWS()関数を使用して行の総数を取得する必要があります。クエリは次のようになります。

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

SELECT FOUND_ROWS();

SQL_CALC_FOUND_ROWS唯一の制限は、行数をどこにも保存しないため、最初のクエリの直後に 2 番目のクエリを呼び出す必要があることです。このソリューションにも 2 つのクエリが必要ですが、メイン クエリを 1 回だけ実行するため、はるかに高速です。SQL_CALC_FOUND_ROWS および FOUND_ROWS()の詳細については、MySQL のドキュメントを参照してください。

編集:ほとんどの場合、クエリを 2 回実行する方が実際には よりも高速であることに注意してくださいSQL_CALC_FOUND_ROWSここを参照

編集2019:

SQL_CALC_FOUND_ROWS クエリ修飾子および付随する FOUND_ROWS() 関数は、MySQL 8.0.17 で廃止され、将来の MySQL バージョンでは削除される予定です。

https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows

COUNT代わりに使用することをお勧めします

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
于 2012-10-14T22:45:01.743 に答える