esistema1 Опубликовано 22 февраля, 2023 Жалоба Поделиться Опубликовано 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(); } Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 22 февраля, 2023 Жалоба Поделиться Опубликовано 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", скорее всего, совсем неверный. Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 22 февраля, 2023 Автор Жалоба Поделиться Опубликовано 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(); } Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 22 февраля, 2023 Автор Жалоба Поделиться Опубликовано 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"); Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 22 февраля, 2023 Жалоба Поделиться Опубликовано 22 февраля, 2023 2 часа назад, esistema1 сказал: Или как можно исправить этот запрос добавив в него новый столбец amount_all в котором будет SUM(p.amount) as amount с учетом where ol.label_id = 1 при это в столбце amount должно быть SUM(p.amount) as amount без учета where Фраза с очень глубоким смыслом. Примерно как ехать в Новосибирск, а приехать в Новгород. Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 23 февраля, 2023 Автор Жалоба Поделиться Опубликовано 23 февраля, 2023 Разобрался, решение SUM(CASE WHEN ol.label_id = 1 THEN p.amount ELSE 0 END) as amount_all Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.