sql >> データベース >  >> RDS >> Mysql

MySQL LIMIT、OFFSETを使用したページネーション

    まず、ページごとに個別のサーバースクリプトを用意しないでください。これは、ただの狂気です。ほとんどのアプリケーションは、URLのページネーションパラメータを使用してページネーションを実装します。次のようなもの:

    http://yoursite.com/itempage.php?page=2
    

    リクエストされたページ番号には、$_GET['page']からアクセスできます。 。

    これにより、SQLの定式化が非常に簡単になります:

    // determine page number from $_GET
    $page = 1;
    if(!empty($_GET['page'])) {
        $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
        if(false === $page) {
            $page = 1;
        }
    }
    
    // set the number of items to display per page
    $items_per_page = 4;
    
    // build query
    $offset = ($page - 1) * $items_per_page;
    $sql = "SELECT * FROM menuitem LIMIT " . $offset . "," . $items_per_page;
    

    たとえば、ここでの入力がpage=2の場合 、1ページに4行の場合、クエリは「

    」になります
    SELECT * FROM menuitem LIMIT 4,4
    

    これがページ付けの基本的な問題です。これで、ページの総数を理解する必要があるという追加の要件があります(これにより、「次のページ」を表示するかどうか、またはリンクを介してページXに直接アクセスできるようにするかどうかを決定できます)。

    >

    これを行うには、テーブルの行数を理解する必要があります。

    実際の制限されたレコードセットを返す前に、DB呼び出しを使用してこれを行うことができます(要求されたページが存在することを明らかに検証したいので、BEFOREと言います)。

    これは実際には非常に簡単です:

    $sql = "SELECT your_primary_key_field FROM menuitem";
    $result = mysqli_query($con, $sql);
    $row_count = mysqli_num_rows($result);
    // free the result set as you don't need it anymore
    mysqli_free_result($result);
    
    $page_count = 0;
    if (0 === $row_count) {  
        // maybe show some error since there is nothing in your table
    } else {
       // determine page_count
       $page_count = (int)ceil($row_count / $items_per_page);
       // double check that request page is in range
       if($page > $page_count) {
            // error to user, maybe set page to 1
            $page = 1;
       }
    }
    
    // make your LIMIT query here as shown above
    
    
    // later when outputting page, you can simply work with $page and $page_count to output links
    // for example
    for ($i = 1; $i <= $page_count; $i++) {
       if ($i === $page) { // this is current page
           echo 'Page ' . $i . '<br>';
       } else { // show link to other page   
           echo '<a href="/menuitem.php?page=' . $i . '">Page ' . $i . '</a><br>';
       }
    }
    


    1. MySQL /書き込みファイルエラー(エラーコード28)

    2. sqliteで外部キーを使用する方法は?

    3. scope_identity()を使用してネストされた一括挿入を実行する最速の方法は?

    4. EntityFramework6トランザクションのロールバック