powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный запрос.(сложный)
25 сообщений из 69, страница 1 из 3
Вложенный запрос.(сложный)
    #38976583
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрйы день.
Имеется не простая задачка, покрайней мере для меня.
Имеются 3 таблицы
`oc_product_description`,`oc_attribute_description`,`oc_product_attribute`


oc_product_description - хранит название продукта и description
oc_product_attribute - хранит значение атрибутов
oc_attribute_description - хранит наименование атрибутов.

Имеется запрос

UPDATE `oc_product_description`,`oc_attribute_description`,`oc_product_attribute`

set `oc_product_description`.`description`=
concat ('Вы можете приобрести ',`oc_product_description`.`name`,' с гарантией от производителя.',' ',`oc_attribute_description`.`name`,' ',`oc_product_attribute`.`text`,' на ',`oc_product_attribute`.`text`)

where `oc_product_description`.`product_id` = 102
and `oc_product_description`.`language_id` = 4
and `oc_attribute_description`.`language_id` = `oc_product_attribute`.`language_id`
and `oc_product_attribute`.`language_id` = `oc_product_description`.`language_id`
and `oc_attribute_description`.`attribute_id` = `oc_product_attribute`.`attribute_id`
and `oc_product_attribute`.`product_id` = `oc_product_description`.`product_id`
and `oc_attribute_description`.`attribute_id` in (2,4,1,10)


Он работает но не так как требуется. Каждый `oc_attribute_description`.`attribute_id` имеет своё значение. Необходимо что бы `oc_product_attribute`.`text` выводились в поле `oc_product_description`.`description` в нужный момент свой.Cейчас выводится text только с id 2

oc_product_description`.`product_id` = 102 задано с целью тестирования.
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38976637
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз тебе нужны записи 4 разных типов (`oc_attribute_description`.`attribute_id` in (2,4,1,10)
), изволь приматывать в запрос 4 копии таблицы oc_attribute_description, и из каждой брать текстовку для одного нужного атрибута.
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38976640
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понял, как это должно выглядеть?
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38976644
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что нужно брать текстовку это понятно но как её приматывать в concat непонятно. Пробывал переменными но тоже не вышло
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38976663
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE `oc_product_description` pd
JOIN `oc_product_attribute` pa
JOIN `oc_attribute_description` ad2 ON pa.attribute_id = ad2.attribute_id AND ad2.attribute_id = 2
JOIN `oc_attribute_description` ad4 ON pa.attribute_id = ad4.attribute_id AND ad4.attribute_id = 4
JOIN `oc_attribute_description` ad1 ON pa.attribute_id = ad1.attribute_id AND ad1.attribute_id = 1
JOIN `oc_attribute_description` ad10 ON pa.attribute_id = ad10.attribute_id AND ad10.attribute_id = 10
...
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38976695
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять, поясните пожалуйста. Что за pd , pa и как их использовать?
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38977197
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде понял. Поменял запрос на такой.

UPDATE `oc_product_description` pd
JOIN `oc_attribute_description` ad
JOIN `oc_product_attribute` pa2 ON pa2.attribute_id = pa2.attribute_id AND pa2.attribute_id = 2
JOIN `oc_product_attribute` pa4 ON pa4.attribute_id = pa4.attribute_id AND pa4.attribute_id = 4
JOIN `oc_product_attribute` pa1 ON pa1.attribute_id = pa1.attribute_id AND pa1.attribute_id = 1
JOIN `oc_product_attribute` pa10 ON pa10.attribute_id = pa10.attribute_id AND pa10.attribute_id = 10
JOIN `oc_product_attribute` pl ON pl.language_id = pl.language_id AND pl.language_id = 4
JOIN `oc_product_attribute` pap ON pap.product_id = pap.product_id
JOIN `oc_product_attribute` pat ON pat.text = pat.text

set pd.`description`=
concat ('Вы можете приобрести ',pd.`name`,' с гарантией от производителя.',' ',ad.`name`,' ',pat.`text`,' на ',pat.`text`)

where pd.`product_id` = 102
and pd.`language_id` = 4
and ad.`language_id` = pl.`language_id`
and pl.`language_id` = pd.`language_id`

or ad.`attribute_id` = pa2.`attribute_id`
or ad.`attribute_id` = pa4.`attribute_id`
or ad.`attribute_id` = pa1.`attribute_id`
or ad.`attribute_id` = pa10.`attribute_id`

and pap.`product_id` = pd.`product_id`

Есть пара проблем,
1) на хостинге такой запрос не может выполниться, всё начинает виснуть)
2) в concat у меня по прежнему pat.`text`,' на ',pat.`text` не прикреплённые к определённому attribute_id, как это сделать?
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38977520
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978312
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraelius,

план гляди. где план?
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978323
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tiraelius,

OR без скобок обрабатывает всю таблицу - так и задумывалось?
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978333
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Что имеете в виду под планом? я не супер спец в sql , могу допускать ошибки.

lamer yuga,

А как по другому, attribut id должен же найти совпадение, или есть другой выход?
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978338
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У кого есть какие идеи пишите пожалуйста развёрнуто, потому что я в тупике. Если есть вопросы спрашивайте.
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978345
1=1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1=1
Гость
tiraelius
Код: sql
1.
2.
...
JOIN `oc_product_attribute` pat ON pat.text = pat.text



Есть пара проблем,
1) на хостинге такой запрос не может выполниться, всё начинает виснуть)
Бугага !1 Ещё бы ! :)
написал бы сразу ON 1=1

Автор, добрый совет
Не выноси тут мозг людям со своим придуманным решением!
Приведи небольшой пример данных таблиц, и результат, который ты на них хочешь получить.

... и в тегах , в тегах, Карл !!
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978365
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1=1tiraelius
Код: sql
1.
2.
...
JOIN `oc_product_attribute` pat ON pat.text = pat.text



Есть пара проблем,
1) на хостинге такой запрос не может выполниться, всё начинает виснуть)
Бугага !1 Ещё бы ! :)
написал бы сразу ON 1=1

Автор, добрый совет
Не выноси тут мозг людям со своим придуманным решением!
Приведи небольшой пример данных таблиц, и результат, который ты на них хочешь получить.

... и в тегах , в тегах, Карл !!

Ok.

3 таблицы

oc_product_description - хранит название продукта и description
oc_product_attribute - хранит значение атрибутов
oc_attribute_description - хранит наименование атрибутов.

oc_product_description
product_id | 102 | 102
language_id | 4 | 1
name | Вытяжка | Вытяжка
description | ........ | ........


oc_product_attribute
product_id | 102 | 102 | 102
attribute_id | 2 | 2 | 3
language_id | 4 | 1 | 4
text | встраиваемая в шкаф | встраиваемая в шкаф | серый

oc_attribute_description
attribute_id | 2 | 2 | 3
language_id | 4 | 1 | 4
name | Установка | Установка | Цвет

language_id имеются 2 но интересует только 4, это русский.
Грубый пример на 1 товаре.

Нужно. в таблице oc_product_description вывести в поле description, такую фишку:
Вы можете приобрести 'Вытяжку' с гарантией от производителя 'Установка' 'встраиваемая в шкаф' и 'Цвет' 'серый'.

нужные фразы с подставлением взяты в кавычки.
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978377
1=1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1=1
Гость
tiraelius1=1пропущено...
Бугага !1 Ещё бы ! :)
написал бы сразу ON 1=1

Автор, добрый совет
Не выноси тут мозг людям со своим придуманным решением!
Приведи небольшой пример данных таблиц, и результат, который ты на них хочешь получить.

... и в тегах , в тегах, Карл !!

Ok.

3 таблицы

oc_product_description - хранит название продукта и description
oc_product_attribute - хранит значение атрибутов
oc_attribute_description - хранит наименование атрибутов.

oc_product_description
Код: sql
1.
2.
3.
4.
product_id        | 102           | 102           
language_id      | 4              | 1               
name               | Вытяжка    | Вытяжка    
description        | ........        | ........




oc_product_attribute
Код: sql
1.
2.
3.
4.
product_id         | 102                             | 102                             | 102
attribute_id        | 2                                | 2                                | 3 
language_id       | 4                                 | 1                               | 4
text                  | встраиваемая в шкаф    | встраиваемая в шкаф   | серый



oc_attribute_description
Код: sql
1.
2.
3.
attribute_id    |  2           | 2                 | 3
language_id   | 4            | 1                 | 4
name            | Установка | Установка   | Цвет



language_id имеются 2 но интересует только 4, это русский.
Грубый пример на 1 товаре.

Нужно. в таблице oc_product_description вывести в поле description, такую фишку:
Вы можете приобрести 'Вытяжку' с гарантией от производителя 'Установка' 'встраиваемая в шкаф' и 'Цвет' 'серый'.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select 
  concat( 
  'Вы можете приобрести "', pd.name, "' с гарантией от производителя',
  ' "', max(case when ad.attribute_id=2 then ad.name end), '" ',
  ' "', max(case when ad.attribute_id=2 then pa.text end), '" ',
  ' и ',
  ' "', max(case when ad.attribute_id=3 then ad.name end), '" ',
  ' "', max(case when ad.attribute_id=3 then pa.text end), '" ') as xz
  
from oc_product_description pd 
inner join oc_product_attribute pa on pd.product_id=pa.product_id and pd.language_id=pa.language_id
inner join oc_attribute_description ad on pa.attribute_id=ad.attribute_id and pa.language_id=ad.language_id

where pd.language_id=4
  and pa.attribute_id in (2,3)

group by pd.name
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978385
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1=1,

Забыл про ещё одну таблицу.
oc_product_to_category
product_id
category_id

в ней идёт сопоставление продукта и относящейся к ней категории товара.
Как к этому запросу ещё category_id прилипить что бы обновлялось description только товаров из данной категории?
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978389
1=1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1=1
Гость
tiraelius1=1,

Забыл про ещё одну таблицу.
oc_product_to_category
product_id
category_id

в ней идёт сопоставление продукта и относящейся к ней категории товара.
Как к этому запросу ещё category_id прилипить что бы обновлялось description только товаров из данной категории?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
  concat( 
  'Вы можете приобрести "', pd.name, '" с гарантией от производителя',
  ' "', max(case when ad.attribute_id=2 then ad.name end), '" ',
  ' "', max(case when ad.attribute_id=2 then pa.text end), '" ',
  ' и ',
  ' "', max(case when ad.attribute_id=3 then ad.name end), '" ',
  ' "', max(case when ad.attribute_id=3 then pa.text end), '" ') as xz
  
from oc_product_description pd 
inner join oc_product_to_category pc on pd.product_id=pc.product_id
inner join oc_product_attribute pa on pd.product_id=pa.product_id and pd.language_id=pa.language_id
inner join oc_attribute_description ad on pa.attribute_id=ad.attribute_id and pa.language_id=ad.language_id

where pd.language_id=4
  and pa.attribute_id in (2,3)
  and pc.category_id=146

group by pd.name
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978395
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1=1,

Не могу никак под update загнать. ругается
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from `oc_product_description` pd
inner join `oc_product_attribute` pa on pd.pr' at line 10


делаю так
авторUPDATE `oc_product_description`
set `oc_product_description`.`description`= concat(
'Вы можете приобрести ', pd.name, ' с гарантией от производителя',
' ', max(case when ad.attribute_id=2 then ad.name end), ' ',
' ', max(case when ad.attribute_id=2 then pa.text end), ' ',
' и ',
' ', max(case when ad.attribute_id=3 then ad.name end), ' ',
' ', max(case when ad.attribute_id=3 then pa.text end), ' ') as xz

from oc_product_description pd
inner join oc_product_attribute pa on pd.product_id=pa.product_id and

pd.language_id=pa.language_id
inner join oc_attribute_description ad on pa.attribute_id=ad.attribute_id and

pa.language_id=ad.language_id
inner join oc_product_to_category pc on pc.product_id=pa.product_id

where pd.language_id=4
and pa.attribute_id in (2,3)
and pc.category_id = 121
and pa.product_id = 102
group by pd.name
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978399
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tiraeliusругаетсяпотому что не надо изобретать свой синтаксис
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978400
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поменял на

UPDATE `oc_product_description` pd
inner join oc_product_attribute pa on pd.product_id=pa.product_id and

pd.language_id=pa.language_id
inner join oc_attribute_description ad on pa.attribute_id=ad.attribute_id and

pa.language_id=ad.language_id
inner join oc_product_to_category pc on pc.product_id=pa.product_id

set pd.`description`= concat(
'Вы можете приобрести ', pd.name, ' с гарантией от производителя',
' ', max(case when ad.attribute_id=2 then ad.name end), ' ',
' ', max(case when ad.attribute_id=2 then pa.text end), ' ',
' и ',
' ', max(case when ad.attribute_id=3 then ad.name end), ' ',
' ', max(case when ad.attribute_id=3 then pa.text end), ' ')

where pd.language_id=4
and pa.attribute_id in (2,3)
and pc.category_id = 121
and pa.product_id = 102


тож не катит
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978401
1=1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1=1
Гость
tiraelius,

или так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
UPDATE pd
set pd.`description`= concat( 
'Вы можете приобрести ', pd.name, ' с гарантией от производителя',
' ', max(case when ad.attribute_id=2 then ad.name end), ' ',
' ', max(case when ad.attribute_id=2 then pa.text end), ' ',
' и ',
' ', max(case when ad.attribute_id=3 then ad.name end), ' ',
' ', max(case when ad.attribute_id=3 then pa.text end), ' ')

from oc_product_description pd 
inner join oc_product_attribute pa on pd.product_id=pa.product_id and 

pd.language_id=pa.language_id
inner join oc_attribute_description ad on pa.attribute_id=ad.attribute_id and 

pa.language_id=ad.language_id
inner join oc_product_to_category pc on pc.product_id=pa.product_id

where pd.language_id=4
and pa.attribute_id in (2,3)
and pc.category_id = 121
and pa.product_id = 102
group by pd.name

(не факт, что в МуСКЛ такое пройдёт)

или так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
update pd
set pd.description=a.xz
from oc_product_description pd

inner join

(select pd.product_id,
  concat( 
  'Вы можете приобрести "', pd.name, '" с гарантией от производителя',
  ' "', max(case when ad.attribute_id=2 then ad.name end), '" ',
  ' "', max(case when ad.attribute_id=2 then pa.text end), '" ',
  ' и ',
  ' "', max(case when ad.attribute_id=3 then ad.name end), '" ',
  ' "', max(case when ad.attribute_id=3 then pa.text end), '" ') as xz
  
from oc_product_description pd 
inner join oc_product_to_category pc on pd.product_id=pc.product_id
inner join oc_product_attribute pa on pd.product_id=pa.product_id and pd.language_id=pa.language_id
inner join oc_attribute_description ad on pa.attribute_id=ad.attribute_id and pa.language_id=ad.language_id

where pd.language_id=4
  and pa.attribute_id in (2,3)
  and pc.category_id=146

group by pd.name, pd.product_id) a

on pd.product_id=a.product_id
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978403
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В каждом находит ошибки ситаксиса.

Давайте 1 вариант разберём.

авторUPDATE `oc_product_description` pd
inner join oc_product_attribute pa on pd.product_id=pa.product_id and

pd.language_id=pa.language_id
inner join oc_attribute_description ad on pa.attribute_id=ad.attribute_id and

pa.language_id=ad.language_id
inner join oc_product_to_category pc on pc.product_id=pa.product_id

set pd.`description`= concat(
'Вы можете приобрести ', pd.name, ' с гарантией от производителя',
' ', max(case when ad.attribute_id=2 then ad.name end), ' ',
' ', max(case when ad.attribute_id=2 then pa.text end), ' ',
' и ',
' ', max(case when ad.attribute_id=3 then ad.name end), ' ',
' ', max(case when ad.attribute_id=3 then pa.text end), ' ')

where pd.language_id=4
and pa.attribute_id in (2,3)
and pc.category_id = 121
and pa.product_id = 102

тут ошибка 1111 invalid use of group function
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978406
1=1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1=1
Гость
tiraeliusтут ошибка 1111 invalid use of group functionэто как раз было из разряда
1=1(не факт, что в МуСКЛ такое пройдёт)
давай ошибки второго
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978408
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1=1,

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from oc_product_description pd
inner join oc_product_attribute pa on pd.produc' at line 10

после этой ошибки я from поднимал перед set , потом мускул ругается на group by и если его убрать то 1111 идёт.
...
Рейтинг: 0 / 0
Вложенный запрос.(сложный)
    #38978413
tiraelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tiraelius,

max в concat какую роль выполняет?
...
Рейтинг: 0 / 0
25 сообщений из 69, страница 1 из 3
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный запрос.(сложный)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]