2

我想在 PHP 中准备一个包含多个 mysql 表的列表页面。所以这可以是N个表,每个表中的记录可以是任何东西,我想为此实现分页。这是在编写分页逻辑之前对我有用的信息:

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);

如果您不想知道结果总数,您可以废弃第二个查询并SQL_CALC_FOUND_ROWS从第一个查询中删除。

以下是有关SQL_CALC_FOUND_ROWS/的更多信息FOUND_ROWS()

另请注意,如果您要应用 a LIMIT,您还应该应用 anORDER BY以保证合理的结果。

于 2012-08-06T09:53:55.540 回答
1

如果您创建一个 UNION 查询,将 split_1、_2 和 _3 的所有记录按所需顺序列出在一个表中,您将不需要任何复杂的分页逻辑。就像在(例如第 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 回答