Логика подкачки для нескольких таблиц в PHP

Я хочу подготовить страницу листинга на PHP с несколькими таблицами mysql. Так что это может быть 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"
}

Пожалуйста, предоставьте функцию, если кто-то уже написал этот тип логики пейджинга. Примечание: это только в качестве примера, но в моем живом приложении количество записей в каждой таблице будет в лаках. И количество столов тоже не фиксировано. Это может быть от 1 до 5 чего угодно.

Пожалуйста помоги.

2 ответа

Решение

Чтобы уточнить мой ответ выше... что вы хотите сделать, это 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()

Обратите внимание, что если вы собираетесь применить LIMIT Вы также должны применить ORDER BY чтобы гарантировать ощутимые результаты.

Если вы создадите запрос UNION, в котором перечислены все записи split_1, _2 и _3 в одной таблице и в нужной последовательности, вам не понадобится какая-либо сложная логика подкачки. Как в (пример для страницы 4)

select * from _split_1 
union select * from _split_2
union select * from _split_3
limit 3 * 15, 15
Другие вопросы по тегам