【问题标题】:Paging logic for multiple tables in PHPPHP中多个表的分页逻辑
【发布时间】:2012-08-06 09:44:29
【问题描述】:

我想在 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 个。

请帮忙。

【问题讨论】:

  • 我认为您希望查看UNIONSELECT SQL_CALC_FOUND_ROWS 的组合,并且您可以删除每个表的记录数的所有硬编码逻辑。
  • 当你开始看到 table_name_(number) 时看起来像一个糟糕的表结构

标签: php mysql logic paging custom-paging


【解决方案1】:

详细说明我上面的答案...您要做的是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

Here是关于SQL_CALC_FOUND_ROWS/FOUND_ROWS()的更多信息

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

【讨论】:

    【解决方案2】:

    如果您创建一个 UNION 查询,将 split_1、_2 和 _3 的所有记录按所需顺序列出在一个表中,您将不需要任何复杂的分页逻辑。 就像在(第 4 页的示例)中一样

    select * from _split_1 
    union select * from _split_2
    union select * from _split_3
    limit 3 * 15, 15
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2017-11-11
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多