2

複数の mysql テーブルを含むリスト ページを PHP で準備したいと考えています。したがって、それは N numner のテーブルになり、各テーブルのレコードは何でもかまいません。そのためのページングを実装したいと思います。ページングロジックを書く前に私に提供されている情報は次のとおりです。

define('RECORDS_PER_PAGE_SPLIT', 15);
$htmlTableList = array(
    '_split_1' => 25,
    '_split_2' => 4,
    '_split_3' => 60
);

$currentPage = 1;
if (isset($_REQUEST['page'])) {
    $currentPage = $_REQUEST['page'];
}
if ($currentPage == '' || $currentPage == '0') {
    $currentPage = 1;
}
$offset = ($currentPage - 1) * RECORDS_PER_PAGE_SPLIT;

次の配列を返すPHP関数(複数テーブルページングのロジックを含む)が必要です:

//For page=1 in request:
Array{
    0 => "SELECT * FROM _split_1 LIMIT 0, 15"
}

//For page=2 in request:
Array{
    0 => "SELECT * FROM _split_1 LIMIT 15, 25",
    1 => "SELECT * FROM _split_2 LIMIT 0, 4",
    2 => "SELECT * FROM _split_3 LIMIT 0, 1",
}

//For page=3 in request:
Array{
    0 => "SELECT * FROM _split_3 LIMIT 1, 16"
}

//For page=4 in request:
Array{
    0 => "SELECT * FROM _split_3 LIMIT 16, 31"
}

誰かがこのタイプのページング ロジックを既に書いている場合は、関数を提供してください。注: これは単なる例ですが、私のライブ アプリケーションでは、各テーブルのレコード数は lacs になります。また、テーブル数も固定ではありません。1から5まで何で​​も構いません。

助けてください。

4

2 に答える 2

3

上記の私の答えを詳しく説明すると...あなたがしたいことはUNION、すべての結果セットを一緒にすることです。その後、MySQLにすべての難しい作業を任せることができます。

したがって、コードは次のようになります。

define('RECORDS_PER_PAGE_SPLIT', 15);

$currentPage = !empty($_REQUEST['page']) ? (int) $_REQUEST['page'] : 1;

$offset = ($currentPage - 1) * RECORDS_PER_PAGE_SPLIT;

$query = "
  SELECT SQL_CALC_FOUND_ROWS *
  FROM (
    SELECT *
    FROM _split_1
    UNION ALL
    SELECT *
    FROM _split_2
    UNION ALL
    SELECT *
    FROM _split_3
  ) u
  LIMIT $offset, ".RECORDS_PER_PAGE_SPLIT."
";

// This contains results for the page
$result = mysqli_query($conn, $query);

// If you want the total number of results to display or for other calulations
$query = "
  SELECT FOUND_ROWS()
";
$foundRows = mysqli_query($conn, $query);

結果の総数を気にしない場合は、2 番目のクエリを破棄してSQL_CALC_FOUND_ROWS、最初のクエリから を削除できます。

SQL_CALC_FOUND_ROWS/についての詳細はこちらFOUND_ROWS()

また、 a を適用する場合は、適切な結果を保証するためにLIMITan も適用する必要があることに注意してください。ORDER BY

于 2012-08-06T09:53:55.540 に答える
1

split_1、_2、および_3のすべてのレコードを1つのテーブルに、目的の順序で一覧表示するUNIONクエリを作成する場合、複雑なページングロジックは必要ありません。のように(4ページの例)

select * from _split_1 
union select * from _split_2
union select * from _split_3
limit 3 * 15, 15
于 2012-08-06T09:50:35.877 に答える