Jump to content
Sign in to follow this  
Evgenka

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

Recommended Posts

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

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

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

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

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

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

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

Спасибо.

Share this post


Link to post
Share on other sites
  1. получаем список id
  2. в цикле для каждого добавляем

просто и надежно

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites
$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'");
}

 

Share this post


Link to post
Share on other sites

Большое спасибо за помощь!

Share this post


Link to post
Share on other sites

Не думаю, что всё выше предложенное, это есть хорошее решение. Зачем вносить в базу данных в таблицу ` 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

 

Share this post


Link to post
Share on other sites

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

  • +1 1

Share this post


Link to post
Share on other sites
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

 

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

 

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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 всегда возвращает цену акции

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Edited by Evgenka

Share this post


Link to post
Share on other sites

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

В БД атрибут записан с 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

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

 

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

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

Share this post


Link to post
Share on other sites

язык в запрос надо добавлять

Share this post


Link to post
Share on other sites

Эх, тут знаний уже не хватило, читаю, что за язык и куда его вставлять

Share this post


Link to post
Share on other sites

Так ни к чему и не пришел... ткните носом, если не сложно

Спасибо.

Share this post


Link to post
Share on other sites

language_id = NNNN

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.