Логика подкачки для нескольких таблиц в 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