Доброго времени суток! Столкнулся с необходимостью править sql запрос и понял что нужно подтянуть знания в этом, но времени на это сейчас нет. Прошу помочь мне. В моделе продукта "/catalog/model/catalog/product.php" есть метод getProductSpecials и sql запрос в нем: Код: $sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id"; Сейчас запрос возвращает все товары у которых есть скидка. Нужно добавить в вывод еще и товары у которых "stock_status_id==9" (имеют состояние на складе Акция). Заранее благодарен.
PHP: $sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.stock_status_id= '9' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";
К сожалению вывод остался прежним. Тоесть выводятся лишь товары на которые вот тут: проставлена акция. А хочется в добавок к ним выводить и те у кого: Итоговый запрос SQL: Код: SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM oc_review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM oc_product_special ps LEFT JOIN oc_product p ON (ps.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.stock_status_id = '9' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,40
Тогда придется целиком запрос переписывать. Функция getProductSpecials делает выборку из таблицы oc_product_special, которая является подмножеством товаров из таблицы oc_product. PHP: $sql = "SELECT DISTINCT p.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_special ps ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND (p.stock_status_id='9' OR (ps.`product_special_id` IS NOT NULL AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())))) GROUP BY p.product_id"; P.S. Хотя я, честно говоря, не совсем понимаю для чего вам этот stock_status_id. Это поле служит для того чтобы клиент знал, что делать в случае если товар на складе отсутствует. А по вашей логике получается - "если товар отсутствует - Акция!"
Вероятно, это был способ вручную сделать товар акционным не трогая цену. Пожалуй, это более красивый способ, чем, например, ставить какую-то метку в одно из ненужных полей артикулов.
Чем он красивее? В админке состояние на складе можно настроить, только если товар отсутствует на складе. Т.е. получается сначала надо установить stock_status_id на Акция, а потом кол-во товара установить в 0. Мне кажется проще установить какую-либо метку в поле ненужного артикула. А сам артикул переименовать. Но возможно тут преследовалась другая цель.
Настроить то можно независимо от наличия, а вот выводиться оно будет, действительно, при отсутствии. И тут уже наступает время правок в шаблоне: либо мы используем поле артикула и подгоняем его вывод, либо поле статуса и корректируем условие, чтоб при определённом stock_status_id статус выводился независимо от количества на складе. А красивее такой вариант тем, что можно текст статусов задавать в админке и создавать неограниченное количество статусов с возможностью выбора в один клик. Хотя, конечно, оба варианта - это костыли для ленивых. ОК достаточно прост, чтоб можно было не выкручиваться на имеющихся параметрах, а создать собственный.
Спасибо за помощь! Заработало. Насчет поля stock_status или "Состояние (на) склада(де)". Не стоит относится к нему так буквально. Хотя и вправду можно использовать остаток товара. Плюс дополнительное поле для отображения того можно ли товар заказать если закончится(Доступен под заказ). Плюс еще поле для товаров в которых нет специальной цены, а указанная уже считается акционной. Плюс еще поле для указания что товар снят с производства. Либо использовать количество товара скорей для администратора сайта и его работы, а для статусов продукта использовать одно поле типа сток_статус и выводить его во всех местах где выводится товар плюс еще в каком-то упрощенном редаторе товаров типа Batch Editor. Хотя это палка двух концов и каждому удобней свое.