33685


**ページングで使用するデータを取得するため、LIMIT と OFFSET を使用したいのですが、  
LIMIT と OFFSET を決めるためには、最初に全体件数を取得する必要があると思います**

* * *

**Q.1回のSQLで処理することは出来ない？**  
・「たくさん結合しているSQL」なので出来れば1回で済ませたい場合でも、全体件数を取得するためには最初にSQL実行するしか手はないのでしょうか？

**処理の流れ**  
・最初に件数を取得するためだけにSQL文を実行して全体件数を取得し、そこから割り出した、LIMIT と OFFSET
を使用し、実際にデータを取得するしかない？  
・結局、同じSQLを2回実行せざるを得ない？

* * *

**追記**  
・Google検索のようなイメージです

> FITSTへ 前へ 5 6 7 8 9 10 11 12 13 14 次へ LASTへ

・データはMySQLへ格納している前提  
・例えば、500件データを格納している内のSELECT結果が200件だった場合、1ページ表示数に応じて分割して取得  
・1ページ表示数10件と指定した場合は、全部で200ページに分割して表示


CC BY-SA 3.0
2017-03-14T14:27:18.167
33321
2017-04-14T08:47:38.373
2017-03-15T08:49:33.600
7886
7886
question
php mysql
ページングで使用するデータを取得するため、LIMIT と OFFSET を使用したいのですが、全体件数を割り出すためには事前にSQLを実行するしかない？


最初から全件取得して、その結果の配列からページングに応じてデータを切り出すようにすれば、SQLの実行自体は一回で済みますね。


CC BY-SA 3.0
2017-03-31T08:01:32.483
33666
2017-03-31T08:01:32.483
21302
33321
answer


MySQL の SELECT には SQL_CALC_FOUND_ROWS オプションというのがあります。  
このオプションをつけて LIMIT つきの SELECT を実行後、FOUND_ROWS() 関数で全件数を取得することが出来ます。

<https://dev.mysql.com/doc/refman/5.6/ja/information-
functions.html#function_found-rows>


CC BY-SA 3.0
2017-04-01T00:26:39.493
33685
2017-04-01T00:26:39.493
3249
33321
answer


1ページあたりの件数とページ番号からOFFSETを計算することができます。

[code]

    $limit = $_GET['limit']; //1ページ内の件数
    $page  = $_GET['page']; //ページ番号
    $offset = $limit * ($page-1); //読み飛ばす件数
    $sql = "SELECT * from t LIMIT {$limit} OFFSET {$offset}";
    
[/code]

このような形でOFFSETを算出できる状況であれば、データ全件取得する必要はありません。


CC BY-SA 3.0
2017-04-14T08:47:38.373
34009
2017-04-14T08:47:38.373
33321
answer