Перейти к содержанию
Evgenka

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

Рекомендуемые сообщения

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

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

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

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

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

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

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

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  1. получаем список id
  2. в цикле для каждого добавляем

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
$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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

language_id = NNNN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.