Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Прошу помочь составить запрос к базе данных MySql


Evgenka

Recommended Posts

Суть вопроса в том, что установлен модуль который выводит различные стикеры к товарам. Есть там стикер "Акция". Выводится он к товарам, у которых в oc_product в поле "upc" записано "special".

Естественно кроме просто красивого стикера цена никак не меняется.

Вот и пытаюсь составить SQL запрос, что бы внести в БД в oc_product_special информацию о акционных товарах.

Логика запроса должна быть следующая:

В oc_product_special необходимо добавить product_id товаров, у которых в таблице oc_product в графе "upc" имеется запись "special" и установить в `oc_product_special`.`price` равный цене этого товара минус допустим 10%

В голове летают отрывки этого запроса, но вот составить целиком рабочий запрос никак не выходит.

Буду благодарен, если кто-то поможет.

Спасибо.

Надіслати
Поділитися на інших сайтах


$query = $this->db->qurery("SELECT product_id, price FROM " . DB_PREFIX . "product WHERE upc != ''");

foreach ($query->rows as $pid) {
	$spec_price = (float)$pid['price'] * 0.9;

	$this->db->query("INSERT INTO " . DB_PREFIX . "product_special SET product_id = '" . (int)$pid['product_id'] . "', customer_group_id = 'ID ГРУППЫ', priority = '1', price = '" . (float)$spec_price . "', date_start = '0000-00-00', date_end = '0000-00-00'");
}

Примерно как-то так можно сделать...

ID ГРУППЫ - это ID для группы пользователей. для каких будет эта скидка распространяться

Если у процент скидки вписан в поле UPC тогда можно сделать так:

$query = $this->db->qurery("SELECT product_id, price, upc FROM " . DB_PREFIX . "product WHERE upc != ''");

foreach ($query->rows as $pid) {
	$spec_price = (float)$pid['price'] * ((100 - (float)$pid['upc']) / 100); //Если целове число, например: 10
	//$spec_price = (float)$pid['price'] * (1 - (float)$pid['upc']); //Если дробное число, например: 0.1
	
	$this->db->query("INSERT INTO " . DB_PREFIX . "product_special SET product_id = '" . (int)$pid['product_id'] . "', customer_group_id = 'ID ГРУППЫ', priority = '1', price = '" . (float)$spec_price . "', date_start = '0000-00-00', date_end = '0000-00-00'");
}

 

Надіслати
Поділитися на інших сайтах

Не думаю, что всё выше предложенное, это есть хорошее решение. Зачем вносить в базу данных в таблицу ` product_special` "насильную" информацию. Тем более если она может меняться, и методом оператора INSERT INTO она уж точно не подойдет. Делайте сразу выводом нужного поля в запросе, путем изменения в модели (\catalog\model\catalog\product.php) запроса в методе getProduct. Есть несколько вариантов. Вот один из них:

$proc = "0.9";//нужный процент, которым можем управлять. Вставить сразу после раскрывающей скобки изменяемого метода
//найти текст строки 
(SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_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())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special
 //поменять
 (SELECT p1.`price`*".$proc." FROM `".DB_PREFIX."product` p1 WHERE p1.`upc` = 'special' AND p.`product_id`=p1.`product_id` LIMIT 1) AS special

 

Надіслати
Поділитися на інших сайтах

6 часов назад, vier сказал:

Не думаю, что всё выше предложенное, это есть хорошее решение. Зачем вносить в базу данных в таблицу ` product_special` "насильную" информацию. Тем более если она может меняться, и методом оператора INSERT INTO она уж точно не подойдет. Делайте сразу выводом нужного поля в запросе, путем изменения в модели (\catalog\model\catalog\product.php) запроса в методе getProduct. Есть несколько вариантов. Вот один из них:


$proc = "0.9";//нужный процент, которым можем управлять. Вставить сразу после раскрывающей скобки изменяемого метода
//найти текст строки 
(SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_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())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special
 //поменять
 (SELECT p1.`price`*".$proc." FROM `".DB_PREFIX."product` p1 WHERE p1.`upc` = 'special' AND p.`product_id`=p1.`product_id` LIMIT 1) AS special

 

и сломать мозг кому-нибудь из "поддержки" через полгода. - не меняются цены на акцию.

 

Или что-то подобное..

Это как у Остера -Вредные советы

 

Надіслати
Поділитися на інших сайтах

да нет. - не сломать - это я пример показал - один из примеров - для наглядности упростил. А так конечно модификаторами надо, да еще и условие туда прописать. Или не переименовать запрос в поле, а к примеру добавить его с другим алисом, и потом его ловить в контроллере.

Надіслати
Поділитися на інших сайтах

8 часов назад, Evgenka сказал:

пока что сделал так:

INSERT INTO `oc_product_special`(`product_id`, `price`) SELECT product_id,price*0.9 FROM oc_product WHERE upc = 'special';

 

правда есть минусы, пока дорабатываю

Ну так правильно сделал

Минусы - понятно, что это добавлено для всех товаров с признаком special

 

С другой стороны, не совсем понятно зачем признак special

Ели product_info всегда возвращает цену акции

Надіслати
Поділитися на інших сайтах

Впринципе, что хотел изначально, того уже добился.

Запрсом к Бд каждый день рандомно выбирается 300 любых товаров на акцию и в upc прописываю "special" (тем самым к изображению товара добавляется стикер "Акция"). Признак "special" используется для другого модуля, что бы выводить стикер к изображению товара, в категории и в карточке.

Ну и далее уже этим запросом добавляю к товарам со "special" акционную цену.

На следующий день чищу и все циклически повторяется.

Своего рода "Товар дня", только тут их много.

Искал модуль с подобным функционалом, но к сожалению так и не нашел. Поэтому для себя сделал таким способом, теперь буду его допиливать.

Змінено користувачем Evgenka
Надіслати
Поділитися на інших сайтах


Уважаемые форумчане, возник еще один вопрос/проблема: продолжаю дальше издеваться над своим магазином, и хочу добавить к товарам атрибуты, а именно размер (одежды).

В БД атрибут записан с ID 15

У каждого товара в названии указан размер : S/M, L/XL, XL/XXL и дт.

 

Составил я следующий запрос:

INSERT INTO `baza_dannix`.`oc_product_attribute`(`product_id`,`attribute_id`,`language_id`,`text`) VALUES ((SELECT product_id FROM oc_product_description WHERE name LIKE '%S/M%'),'15','1','S/M');

 

B ответ получаю ошибку  #1242 - Subquery returns more than 1 row

Погуглив и почитав различные форумы понял, что сервер ожидает в ответ только одну строку, а по моим условиям их много, вот собственно и ошибка.

 

Прошу помощи, как верно будет сформировать данный запрос?

Спасибо за вашу помощь.

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.