Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный запрос.(сложный) / 25 сообщений из 69, страница 1 из 3
04.06.2015, 17:19:36
    #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
04.06.2015, 17:48:14
    #38976637
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
Раз тебе нужны записи 4 разных типов (`oc_attribute_description`.`attribute_id` in (2,4,1,10)
), изволь приматывать в запрос 4 копии таблицы oc_attribute_description, и из каждой брать текстовку для одного нужного атрибута.
...
Рейтинг: 0 / 0
04.06.2015, 17:52:11
    #38976640
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
Не понял, как это должно выглядеть?
...
Рейтинг: 0 / 0
04.06.2015, 17:55:24
    #38976644
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
То что нужно брать текстовку это понятно но как её приматывать в concat непонятно. Пробывал переменными но тоже не вышло
...
Рейтинг: 0 / 0
04.06.2015, 18:03:54
    #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
04.06.2015, 18:26:50
    #38976695
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
Не могу понять, поясните пожалуйста. Что за pd , pa и как их использовать?
...
Рейтинг: 0 / 0
05.06.2015, 11:55:28
    #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
05.06.2015, 15:26:13
    #38977520
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
up
...
Рейтинг: 0 / 0
07.06.2015, 08:12:05
    #38978312
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
tiraelius,

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

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

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

lamer yuga,

А как по другому, attribut id должен же найти совпадение, или есть другой выход?
...
Рейтинг: 0 / 0
07.06.2015, 10:56:23
    #38978338
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
У кого есть какие идеи пишите пожалуйста развёрнуто, потому что я в тупике. Если есть вопросы спрашивайте.
...
Рейтинг: 0 / 0
07.06.2015, 11:02:13
    #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
07.06.2015, 12:03:12
    #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
07.06.2015, 12:33:53
    #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
07.06.2015, 13:07:42
    #38978385
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
1=1,

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

в ней идёт сопоставление продукта и относящейся к ней категории товара.
Как к этому запросу ещё category_id прилипить что бы обновлялось description только товаров из данной категории?
...
Рейтинг: 0 / 0
07.06.2015, 13:11:58
    #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
07.06.2015, 13:29:31
    #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
07.06.2015, 13:35:46
    #38978399
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
tiraeliusругаетсяпотому что не надо изобретать свой синтаксис
...
Рейтинг: 0 / 0
07.06.2015, 13:38:13
    #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
07.06.2015, 13:42:03
    #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
07.06.2015, 13:51:12
    #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
07.06.2015, 14:01:58
    #38978406
1=1
1=1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
tiraeliusтут ошибка 1111 invalid use of group functionэто как раз было из разряда
1=1(не факт, что в МуСКЛ такое пройдёт)
давай ошибки второго
...
Рейтинг: 0 / 0
07.06.2015, 14:04:59
    #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
07.06.2015, 14:11:18
    #38978413
tiraelius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос.(сложный)
tiraelius,

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


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