belkin-labs Опубликовано 22 августа, 2023 Поделиться Post #5181 Опубликовано 22 августа, 2023 (изменено) Спойлер Вот вижу следующий код для прохождения таблицы порциями: 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; // Вот то, что меняется в цикле } Изменено 22 августа, 2023 пользователем belkin-labs Ссылка на комментарий
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти