前やった方法⇒OracleでLIMITを実装する - 揮発性のメモ
これだと、副問い合わせ(インラインビュー)されるので、外部結合してカラム数が1000超えてるときとかにエラーになってしまう。
PDOを使う方法
SELECT a,b,c FROM hoge ORDER BY a LIMIT 10,20;
$query = "SELECT a,b,c FROM hoge ORDER BY a"; $offset = 10; $count = 20; $sth = $dbh->prepare( $query, array( PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL ) ); //for( $i=0; $i<$count; $i++ ){ for( $i=1; $i<=$count; $i++ ){ $datas = $sth->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $offset+$i ); if( $datas===FALSE )break; // なんか処理 } $sth->closeCursor();
プリフェッチするときにカーソルがスクロール可能であると設定して、フェッチするときにカーソルの絶対位置を指定する。
必要な個数だけフェッチしたらあとは破棄する。
※カーソルの位置はどうも1始まりっぽい。
長所:副問い合わせがなくなってすっきりする
短所:なんか遅い