SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.04.2016 15:34:05

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Переделать select в insert

Всем Добра!

Есть запрос

SELECT product_id, attribute_id, language_id, attr_new, SUBSTRING_BY_INDEX(text, 'x', attr_new) attr
FROM oc_product_attribute, (SELECT -1 attr_new UNION SELECT -2 UNION SELECT -3) dummy
where `attribute_id` = 629
and `language_id` = 4
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != ''


Запрос выполняется как надо(смприложеный файл)

Создана функция

DELIMITER //

CREATE FUNCTION SUBSTRING_BY_INDEX(Source VARCHAR(255), Delimiter VARCHAR(255), Number INT)
RETURNS VARCHAR(255)
DETERMINISTIC
NO SQL
BEGIN
    IF ((LENGTH(Source) - LENGTH(REPLACE(Source, Delimiter, ''))) / LENGTH(Delimiter) >= ABS(Number) - 1)
        AND (Number != 0)
    THEN
        RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Source, Delimiter, Number), Delimiter, -SIGN(Number)));
    ELSE
        RETURN '';
    END IF;
END;
//

DELIMITER ;


Что он делает. Перваначально таблица выглядит так
product_id    attribute_id    language_id    text
701    629    4    7.5 x 28.8 x 51 см

селекст разбивает так как указано на скрине.

Вообщем нужно из этого селекта сделать Insert на добавление атрибутов с характеристиками в таблицу oc_product_attribute. Каждый параметр 7.5 x 28.8 x 51 см должен добавлятся к тому product_id к которому он прикреплён, меняется только attribute_id, а они такие
796        Высота
797        Ширина
798        Глубина

И в итоге должно получится так

product_id    attribute_id    language_id    text
701    796    4    7.5 см
701    797    4    28.8 см
701    798    4    51 см

Сам селект разбивает верно, как переделать на insert не знаю...

Отредактированно Bazz (13.04.2016 15:34:54)


Прикрепленные файлы:
Attachment Icon 55mF5.jpg, Размер: 15,528 байт, Скачано: 485

Неактивен

 

#2 13.04.2016 15:55:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переделать select в insert

insert into oc_product_attribute (product_id, attribute_id, language_id, text)
SELECT product_id, if(attr_new=-1, 798, if(attr_new=-2), 797, 796), language_id, SUBSTRING_BY_INDEX(text, 'x', attr_new)
FROM oc_product_attribute, (SELECT -1 attr_new UNION SELECT -2 UNION SELECT -3) dummy
where `attribute_id` = 629
and `language_id` = 4
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != '';

Неактивен

 

#3 13.04.2016 16:04:13

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

vasya написал:

insert into oc_product_attribute (product_id, attribute_id, language_id, text)
SELECT product_id, if(attr_new=-1, 798, if(attr_new=-2), 797, 796), language_id, SUBSTRING_BY_INDEX(text, 'x', attr_new)
FROM oc_product_attribute, (SELECT -1 attr_new UNION SELECT -2 UNION SELECT -3) dummy
where `attribute_id` = 629
and `language_id` = 4
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != '';

Ответ MySQL:

#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 '), 797, 796), language_id, SUBSTRING_BY_INDEX(text, 'x', attr_new)
FROM oc_pro' at line 2

Неактивен

 

#4 13.04.2016 16:08:31

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

Тут такая фича что не все позиции имеют по 3 параметра, есть которые по 2. Т.е есть такие **х** и такие **х**х**

Неактивен

 

#5 13.04.2016 16:12:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переделать select в insert

Bazz написал:

Ответ MySQL:

#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 '), 797, 796), language_id, SUBSTRING_BY_INDEX(text, 'x', attr_new)
FROM oc_pro' at line 2

скобку не туда поставил


insert into oc_product_attribute (product_id, attribute_id, language_id, text)
SELECT product_id, if(attr_new=-1, 798, if(attr_new=-2, 797, 796)), language_id, SUBSTRING_BY_INDEX(text, 'x', attr_new)
FROM oc_product_attribute, (SELECT -1 attr_new UNION SELECT -2 UNION SELECT -3) dummy
where `attribute_id` = 629
and `language_id` = 4
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != '';

Неактивен

 

#6 13.04.2016 16:16:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переделать select в insert

Bazz написал:

Тут такая фича что не все позиции имеют по 3 параметра, есть которые по 2. Т.е есть такие **х** и такие **х**х**

это вопрос к вашему select, чтобы он корректно их обрабатывал и выставлял правильные значения attr_new
в insert-е действует правило, что -1 это глубина, attribute_id = 798
-2 ширина attribute_id = 797;
-3 высота attribute_id = 796

Неактивен

 

#7 13.04.2016 16:33:55

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

vasya написал:

Bazz написал:

Тут такая фича что не все позиции имеют по 3 параметра, есть которые по 2. Т.е есть такие **х** и такие **х**х**

это вопрос к вашему select, чтобы он корректно их обрабатывал и выставлял правильные значения attr_new
в insert-е действует правило, что -1 это глубина, attribute_id = 798
-2 ширина attribute_id = 797;
-3 высота attribute_id = 796

Добавилось но без 798 id, хотя в attr_new он есть......
    701    796    4    7.5
    701    797    4    28.8

Неактивен

 

#8 13.04.2016 16:40:53

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

АА пордон перенеслась запись на другой лист, всё работает!

Неактивен

 

#9 14.04.2016 16:01:04

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

 
Есть необходимость добавлять по 1 атрибуту а не сразу все 3.

SELECT product_id, attribute_id, language_id, attr_new, SUBSTRING_BY_INDEX(text, 'x', attr_new) attr
FROM oc_product_attribute, (SELECT -2 attr_new) dummy
where `attribute_id` = 75
and `product_id` = 227
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != ''
order by `product_id`



запрос такой, он работает.
 

но insert не хочет

insert into oc_product_attribute (product_id, attribute_id, language_id, text)
SELECT product_id, if(attr_new=-2, 796), language_id, SUBSTRING_BY_INDEX(text, 'x', attr_new)
FROM oc_product_attribute, (SELECT -2 attr_new ) dummy
where `attribute_id` = 75
and `product_id` = 227
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != '';

ошибка, где непйму

Неактивен

 

#10 14.04.2016 16:56:25

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переделать select в insert

текст ошибки лучше всё-таки писать
в данном случае синтаксическая ошибка из-за того, что у if() должно быть 3 аргумента, а у вас только 2.
но в данном случае, так как у вас только один вариант равный -2 то if не нужен
вместо
if(attr_new=-2, 796)
пишите
796

Неактивен

 

#11 14.04.2016 18:08:54

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

Спасибо работает!

Неактивен

 

#12 27.04.2016 13:36:00

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

Возникла необходимость добавить условие из другой таблицы. Чтобы не у всех позиций менялось а только у вновь добавленных.
`oc_product`

product_id    model    sku    upc    ean    jan    isbn    mpn    location    quantity    stock_status_id    image    manufacturer_id    shipping    price    points    tax_class_id    date_available    weight    weight_class_id    length    width    height    length_class_id    subtract    minimum    sort_order    status    date_added    date_modified

SELECT * FROM `oc_product` where `date_added` like '%2016-04-27%'


Этот селект покажет кто добавился сегодня, как его в доп условие добавить где insert?

сейчас он такой
insert into oc_product_attribute (product_id, attribute_id, language_id, text)
SELECT product_id, 796, language_id, SUBSTRING_BY_INDEX(text, 'x', attr_new)
FROM oc_product_attribute, (SELECT -1 attr_new ) dummy
where `attribute_id` in (130,148)
AND SUBSTRING_BY_INDEX(TEXT,  'x', attr_new) != '';

Отредактированно Bazz (27.04.2016 13:37:29)

Неактивен

 

#13 27.04.2016 14:28:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переделать select в insert

where `attribute_id` in (130,148) and product_id in (SELECT product_id FROM `oc_product` where `date_added` like '%2016-04-27%')

Неактивен

 

#14 27.04.2016 14:42:26

Bazz
Участник
Зарегистрирован: 13.04.2016
Сообщений: 18

Re: Переделать select в insert

Спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson