SQL запрос с выборкой из нескольких таблиц

V
На сайте с 17.06.2014
Offline
31
955

Здравствуйте.

Подскажите пожалуйста, каким образом можно сформировать следующий запрос:

- вставить поле `attribute_id` = `101` в таблице `oc_product_attribute` со значением `Черный` в поле `text`

При таких условиях:

- поле `language_id` таблицы `oc_product_attribute` = `1`

- в таблице `oc_product_attribute` отсутствует поле `attribute_id` со значением `101` (нужно отобрать product_id, которым вообще не присвоено `attribute_id` = `101`)

- поле `name` таблицы `oc_product_description` содержит слово `%черн%` (может быть как вначале, так и в середине названия)

общий параметр в обеих таблицах: `product_id`

Цель данного запроса: отобрать все товары, которым вообще не присвоен атрибут "Цвет", а в названии которых встречается слово "..черн.." - добавить всем таким товарам атрибут "Цвет" со значением "Черный"

скрин таблицы `oc_product_attribute` http://prntscr.com/hi15l8

скрин таблицы `oc_product_description` http://prntscr.com/hi15vz

nezabor
На сайте с 19.07.2010
Offline
152
#1

Vaicat, это вам один раз всю таблицу заполнить надо?

---------- Добавлено 02.12.2017 в 13:40 ----------

Vaicat, скиньте схему таблиц

оч влом создавать у себя со скрина

---------- Добавлено 02.12.2017 в 13:58 ----------

Vaicat, по идее вот так


INSERT INTO oc_product_attribute (product_id,
atribute_id,
language_id,
text)
VALUES (
(SELECT PD.product_id, CONCAT('101') AS atribute_id, PD.language_id, CONCAT('Черный') AS text
FROM oc_product_description PD
LEFT JOIN oc_product_attribute PA ON PA.product_id = PD.product_id
WHERE PD.description LIKE '%черн%' AND PA.language_id = 1 AND PA.atribute_id <> 101
)
);


---------- Добавлено 02.12.2017 в 14:00 ----------

но
Vaicat:
- поле `language_id` таблицы `oc_product_attribute` = `1`

вот с этим вопрос, т.е. если вы хотите добавить новые записи в атрибуты, то зачем мы это проверяем?

по больше бы рассказали что к чему

Чудес не бывает...
C
На сайте с 04.02.2005
Offline
291
#2
Vaicat:
Цель данного запроса: отобрать все товары, которым вообще не присвоен атрибут "Цвет", а в названии которых встречается слово "..черн.." - добавить всем таким товарам атрибут "Цвет" со значением "Черный"

SELECT p.product_id
FROM oc_product p
LEFT JOIN oc_product_attribute pa ON p.product_id = pa.product_id AND pa.text='черный' AND pa.language_id=1
WHERE pa.product_id is null;

SELECT p.product_id
FROM oc_product p
JOIN oc_product_description pd ON p.product_id=pd.product_id AND pd.language_id =1 AND pd.name LIKE '%черн%'
LEFT JOIN oc_product_attribute pa ON p.product_id = pa.product_id AND pa.text='черный' AND pa.language_id=1
WHERE pa.product_id is null;

А потом у вас не хватает еще одного условия - attribute_id

INSERT INTO oc_product_attribute (product_id,language_id,`text`, attribute_id) 
SELECT p.product_id, 1, 'черный', ЗДЕСЬ АйДи АТРИБУТА
FROM oc_product p
JOIN oc_product_description pd ON p.product_id=pd.product_id AND pd.language_id =1 AND pd.name LIKE '%черн%'
LEFT JOIN oc_product_attribute pa ON p.product_id = pa.product_id AND pa.text='черный' AND pa.language_id=1
WHERE pa.product_id is null;

ага, дочитал

ЗДЕСЬ АйДи АТРИБУТА - 101

но сначала - бекап, бекап, бекап

V
На сайте с 17.06.2014
Offline
31
#3
nezabor:
Vaicat, это вам один раз всю таблицу заполнить надо?

этот запрос должен выполняться периодически

nezabor:
Vaicat, скиньте схему таблиц
оч влом создавать у себя со скрина

oc_product_attribute (product_id, attribute_id, language_id, text)

product_description (product_id, language_id, name, description, meta_description, meta_keyword, meta_title, meta_h1)

nezabor:

вот с этим вопрос, т.е. если вы хотите добавить новые записи в атрибуты, то зачем мы это проверяем?

по больше бы рассказали что к чему

тут Вы правы, добавлять в проверку language_id в данном запросе нет особого смысла, раз уж все равно вставляется строка.

---------- Добавлено 02.12.2017 в 18:04 ----------

Chukcha:

но сначала - бекап, бекап, бекап

Спасибо огромное - буду проверять (и конечно же, бекапить)

nezabor
На сайте с 19.07.2010
Offline
152
#4
Vaicat:
этот запрос должен выполняться периодически

может вам тригер замутить на UPDATE

C
На сайте с 04.02.2005
Offline
291
#5
nezabor:
может вам тригер замутить на UPDATE

Ага, а потом не найти концов, когда это будет не нужно..

Все зависит от версии опенкарта, если это >= 2.3 , то можно событие product/edit/befote замутить

на 2.1 - чуть -чуть иначе..

V
На сайте с 17.06.2014
Offline
31
#6
Chukcha:
Ага, а потом не найти концов, когда это будет не нужно..

Все зависит от версии опенкарта, если это >= 2.3 , то можно событие product/edit/befote замутить
на 2.1 - чуть -чуть иначе..

да, тут как раз версия 2.1

для сайта уже допилен небольшой скрипт, который по крону дергает прописанные в нем SQL-запросы, данный запрос планируется поместить туда же

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий