![]() ![]() |
Алгоритм объединенного поиска по нескольким источникам информации с постраничной навигациейДопустим, у нас имеется несколько типов источников информации: тип A (например, статьи), тип B (например, новости), тип C (например, каталог товаров) и т.д. Сделать выборку необходимой информации по отдельности из каждого источника является тривиальной задачей, на которой останавливаться не будем. Сделать объединенный поиск без разбивки на страницы тоже нетрудно. В этой статье я покажу на примере языка Perl, как сделать постраничный вывод информации из нескольких источников.
Построение массива @limit
# число записей на одной странице
my $recordsPerPage = 10;
# $page - номер просматриваемой страницы
# с этой записи начинаем выводить my $start = $recordsPerPage * ($page - 1); my @limit = (); # содержит только ОТ и my $looked = 0; # число "просмотренных" записей, # тех, что нужно показывать для этой страницы my $s = 0; # сумма возможных результатов поиска (столбец 2 таблицы) for (my $i = 0; $i <= $#canBeFound; $i++) { # по всем элементам массива @canBeFound if ( $canBeFound[$i] > 0 ) { if ( $start > $s && $start <= ($s + $canBeFound[$i]) ) { # нашли начало my $l2 = $s + $canBeFound[$i] - $start + 1; my $l1 = $canBeFound[$i] - $l2; $l2 = $recordsPerPage if $l2 > $recordsPerPage; $l1 = 0 if $l1 < 0; $limit[$i] = [$l1, $l2]; $looked += $l2; undef $l2; undef $l1; } else { if ( $looked > 0 ) { # уже что-то находили my $left = $recordsPerPage - $looked; if ( $looked < $recordsPerPage ) { if ( $canBeFound[$i] > $left ) { $limit[$i] = [0, $left]; $looked += $left; } else { $limit[$i] = [0, $canBeFound[$i]]; $looked += $canBeFound[$i]; } } else { $limit[$i] = [0, 0]; } } else { $limit[$i] = [0, 0]; } } } else { $limit[$i] = [0, 0]; } $s += $canBeFound[$i]; } undef $looked; undef $s; Замечание 1: особенностью такого решения является то, что оно подходит не только для СУБД типа MySQL, но и для других типов хранилищ, например, на основе обычных файлов. Замечание 2: в MySQL 4.0.0 появилась возможность использования UNION, но до MySQL 4.1.1 типы и размеры полей задавались первой конструкцией SELECT, что лимитировало использование следующих конструкций SELECT, да и число самих извлекаемых полей (столбцов), как правило, от источника к источнику варьируется. Алексей Кощеев
13.05.2005 |
|
© Алексей Кощеев, г.Киров, 2001-2023 |
|