Перейти к содержанию

Предложение по алгоритму.


Рекомендуемые сообщения

Спойлер

Вот вижу следующий код для прохождения таблицы порциями:

 

        if($settings['include_products'] == 'Y') {
            $step_limit = 1000;
            $products_loaded = 0;
            $join = ' INNER JOIN ?:products_categories ON ?:products_categories.product_id = ?:products.product_id INNER JOIN ?:categories ON ?:categories.category_id = ?:products_categories.category_id AND ?:categories.status IN ("A", "H") ';
            $condition = '?:products.status = "A" ';
            $condition .= fn_allowed_for('MULTIVENDOR') ? fn_get_company_condition('?:products.company_id') : fn_get_company_condition('?:categories.company_id');
            if($settings['exclude_products'] == 'without_amount') {
                $condition .= ' AND ?:products.amount > 0';
            } elseif($settings['exclude_products'] == 'without_price') {
                $join .= ' INNER JOIN ?:product_prices AS pp ON pp.product_id = ?:products.product_id AND pp.lower_limit = 1 AND pp.usergroup_id = 0';
                $condition .= ' AND pp.price > 0';
            } elseif($settings['exclude_products'] == 'without_amount_and_price') {
                $join .= ' INNER JOIN ?:product_prices AS pp ON pp.product_id = ?:products.product_id AND pp.lower_limit = 1 AND pp.usergroup_id = 0';
                $condition .= ' AND (?:products.amount > 0 OR pp.price > 0)';
            }
            fn_set_hook('ab__as_get_products', $settings, $join, $condition);
            $products_count = db_get_field('SELECT COUNT(DISTINCT ?:products.product_id) FROM ?:products ?p WHERE ?p', $join, $condition);
            while($products_count > $products_loaded) {
                $limit = min($products_count, $step_limit);
                $products = db_get_fields('SELECT ?:products.product_id FROM ?:products ?p WHERE ?p GROUP BY ?:products.product_id LIMIT ?i, ?i', $join, $condition, $products_loaded, $limit);
                $products_loaded += $limit;
                while(!empty($products)) {
                    $product = array_shift($products);
                    $links = fn_ab__as_generate_links('product', $product, $languages);
                    $item = fn_ab__as_print_sitemap_item($links);
                    fn_ab__as_check_counter($file, $filename, $sitemap_links_counter, $sitemap_file_counter, $links, $file_header, $file_footer);
                    fwrite($file, $item);
                }
            }
        }

 

 

Хочу предложить вам очень простой и отлично зарекомендовавший себя алгоритм по прохождению таблицы порциями.

В нем не нужно подсчитывать количество записей в таблице:

 

$step = 1;  // для того, чтобы можно было начинать не сначала
$count = 500; // размер порции в записях
$limit = ($step-1)*$count;  // Начальный лимит
$i = $step; // $i можно использовать в качестве отсылки к конкретному номеру шага.
   while (1) {
       $codes = db_get_array("SELECT product_code FROM ?:products ORDER BY product_code LIMIT $limit,$count");
       do_smth_with_codes($codes);

       if (count($codes) < $count) {
             break;  // Заканчиваем цикл
       }
       $i++;           // Это информационная переменная
       $limit+=$count; // Вот то, что меняется в цикле
   }

 

Изменено пользователем belkin-labs
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...