У меня есть этот странный код на сайте. Он получает все записи (order by pozycja), затем создает какой-то стек и ограничивает показанные записи до 10. Однако, если существует более 200 записей, это занимает слишком много времени, поскольку он обрабатывает всю таблицу вместо 10.
Используемые значения:
$int_ilosc_na_strone = 10;
$liczba_wierszy = 200;
Podzial_na_podstrony::get_limit_object($int_ilosc, $int_ilosc_na_strone) = 10;
$order = NULL;
public function produkty_kat($adres, $liczba_wierszy, $int_ilosc_na_strone) {
require_once('lib/Podzial_na_podstrony.class.php');
$rozloz = explode("/", $adres);
$id = $rozloz[2];
$order = $this->podaj_order($adres, 'kategorie');
if (empty($order)) {
$order = 'produkty.pozycja ASC';
}
if ($order=='price') {
$order = "produkty.cena ASC";
}
$firstack = $this->database->pobierz("SELECT id FROM subkategorie WHERE kategorie_id = '$id' ORDER BY pozycja");
foreach($firstack as $firstack)
{
$stack = $this->database->pobierz("SELECT id FROM sub_subkategorie WHERE subkategorie_id = '{$firstack['id']}' ORDER BY pozycja");
foreach($stack as $stack)
{
$prods[] = $this->database->pobierz("SELECT produkty.id FROM produkty, przyporzadkowania, stany_magazynowe, gk_grupy_produkty WHERE stany_magazynowe.produkty_id=produkty.id AND produkty.id=przyporzadkowania.produkty_id AND przyporzadkowania.sub_subkategorie_id={$stack['id']} AND produkty.widoczny='1' AND produkty.id = gk_grupy_produkty.id_produktu AND gk_grupy_produkty.id_grupy=$this->int_id_grupy AND gk_grupy_produkty.towar_widocznosc=1 GROUP BY produkty.pozycja ORDER BY $order");
}
$temp = array();
foreach($prods as $o)
{
foreach($o as $o)
{
$temp[] = $o;
}
}
}
$temp2 = array();
foreach($temp as $o)
{
$temp2[] = $o;
}
$wynik = $temp2;
$int_ilosc = count($wynik);
$this->int_liczba_wierszy = $int_ilosc;
$obj_limit = null;
if ($int_ilosc_na_strone > 0) {
$obj_limit = Podzial_na_podstrony::get_limit_object($int_ilosc, $int_ilosc_na_strone);
}
$temp = array();
$c = 0;
foreach($wynik as $v)
{
if(is_object($obj_limit))
{
if($c >= $obj_limit->min && $c < ($obj_limit->min + $obj_limit->max))
{
$temp[] = $v;
}
else if($c == ($obj_limit->min + $obj_limit->max))
{
break;
}
}
else
{
$temp = $wynik;
break;
}
$c++;
}
$paged = $temp;
return $paged;
}
Это один большой беспорядок, и я думаю, что есть способ сделать его чище с помощью объединений SQL.
Спасибо за помощь!
Обновление:
Я хочу установить продукты в соответствующей категории / подкатегории / подкатегории (это функция для основных категорий) в определенном порядке. Он подобен стеку, потому что каждый продукт имеет только свою позицию в определенной подкатегории. Подкатегории имеют позиции в подкатегориях, подкатегории в категориях.
Так это выглядит так:
категория
- подкатегория 2 (позиция 1)
- подкатегория 6 (позиция 1)
--- продукт 11 (позиция 1)
--- продукт 7 (позиция 2)
- подкатегория 3 (позиция 2)
--- продукт 3 (позиция 1)
--- продукт 2 (позиция 1)
Etc. Поле "pozycja" - это позиция, а число сразу после элемента - его идентификатор. Так что теперь я должен пройтись по элементам, затем установить стек и вернуть только часть.
Имя БД: panelepo_sweb