esistema1 Posted February 22, 2023 Report Share Posted February 22, 2023 Добрый день! Есть функция get_report_purchases она выводит список товаров и кол-во их продаж за период. Я пытаюсь вывести рядом кол-во возвратов по каждому товара (пример 30 продаж/10 возвратов) добавив функцию get_report_vozvrat, результат get_report_purchases вывожу через foreach, внутри него делаю еще один foreach с выборкой из get_report_vozvrat чтобы получить количество возвратов. Сам запрос в базу работает и выводит товары, но ничего не выводится в шаблоне т.к. не могу понять как заставить функцию проверять p.product_id Помогите, пожалуйста, решить данный вопрос. function get_report_purchases($filter = array()) { //Выборка товара // По умолчанию $sort_prod = 'sum_price DESC'; if(isset($filter['sort_prod'])){ switch($filter['sort_prod']){ case 'price': $sort_prod = $this->db->placehold('sum_price DESC'); break; case 'price_in': $sort_prod = $this->db->placehold('sum_price ASC'); break; case 'amount': $sort_prod = $this->db->placehold('amount DESC'); break; case 'amount_in': $sort_prod = $this->db->placehold('amount ASC'); break; } } $all_filters = $this->make_filter($filter); // Выбираем заказы $query = $this->db->placehold("SELECT o.id, p.product_id, p.variant_id, p.product_name, p.variant_name, SUM(p.price * p.amount) as sum_price, SUM(p.amount) as amount, p.sku FROM __purchases AS p LEFT JOIN __orders AS o ON o.id = p.order_id LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id WHERE 1 $all_filters AND p.product_id > 9000 GROUP BY p.product_id ORDER BY $sort_prod"); $this->db->query($query); return $this->db->results(); } function get_report_vozvrat($filter = array(),$id) { //Выборка возвратов // По умолчанию $product_id = ''; if(isset($filter['product_id'])) $product_id = $this->db->placehold('AND p.product_id = ?', intval($filter['product_id'])); $all_filters = $this->make_filter($filter); // Выбираем заказы $query = $this->db->placehold("SELECT o.id, p.product_id, SUM(p.amount) as amount, p.sku FROM __purchases AS p LEFT JOIN __orders AS o ON o.id = p.order_id LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id WHERE 1 $all_filters AND ol.label_id = 1 AND p.product_id=? "); $this->db->query($query); return $this->db->results(); } Quote Link to post Share on other sites
phukortsin Posted February 22, 2023 Report Share Posted February 22, 2023 Переменная $product_id нигде не используется. Возможно, надо вместо WHERE 1 $all_filters AND ol.label_id = 1 AND p.product_id=? писать WHERE 1 $all_filters AND ol.label_id = 1 $product_id И объявление функции function get_report_vozvrat($filter = array(),$id) { странное, надо function get_report_vozvrat($filter = array()) { И сам по себе подход странный. Обычно не делают такие выборки, при большом кол-ве заказов возможны тормоза вплоть до зависания. И сомнительно, что запрос работает правильно, если в нем считается SUM без группировки результатов. И подход "результат get_report_purchases вывожу через foreach, внутри него делаю еще один foreach с выборкой из get_report_vozvrat", скорее всего, совсем неверный. Quote Link to post Share on other sites
esistema1 Posted February 22, 2023 Author Report Share Posted February 22, 2023 Если делать так , то все равно ничего не получается.. Выводятся подряд все возможные значения цикла function get_report_vozvrat($filter = array()) { //Выборка возвратов // По умолчанию $product_id = ''; if(isset($filter['product_id'])) $product_id = $this->db->placehold('AND p.product_id = ?', intval($filter['product_id'])); $all_filters = $this->make_filter($filter); // Выбираем заказы $query = $this->db->placehold("SELECT o.id, p.product_id, SUM(p.amount) as amount, p.sku FROM __purchases AS p LEFT JOIN __orders AS o ON o.id = p.order_id LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id WHERE 1 $all_filters AND ol.label_id = 1 $product_id GROUP BY p.product_id "); $this->db->query($query); return $this->db->results(); } Quote Link to post Share on other sites
esistema1 Posted February 22, 2023 Author Report Share Posted February 22, 2023 Или как можно исправить этот запрос добавив в него новый столбец amount_all в котором будет SUM(p.amount) as amount с учетом where ol.label_id = 1 при это в столбце amount должно быть SUM(p.amount) as amount без учета where SELECT o.id, p.product_id, p.variant_id, p.product_name, p.variant_name, SUM(p.price * p.amount) as sum_price, SUM(p.amount) as amount, p.sku FROM __purchases AS p LEFT JOIN __orders AS o ON o.id = p.order_id LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id WHERE 1 $all_filters AND p.product_id > 9000 GROUP BY p.product_id ORDER BY $sort_prod"); Quote Link to post Share on other sites
phukortsin Posted February 22, 2023 Report Share Posted February 22, 2023 2 часа назад, esistema1 сказал: Или как можно исправить этот запрос добавив в него новый столбец amount_all в котором будет SUM(p.amount) as amount с учетом where ol.label_id = 1 при это в столбце amount должно быть SUM(p.amount) as amount без учета where Фраза с очень глубоким смыслом. Примерно как ехать в Новосибирск, а приехать в Новгород. Quote Link to post Share on other sites
esistema1 Posted February 23, 2023 Author Report Share Posted February 23, 2023 Разобрался, решение SUM(CASE WHEN ol.label_id = 1 THEN p.amount ELSE 0 END) as amount_all Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.