SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 02.03.2024 15:54:12

RustHrust
Участник
Зарегистрирован: 02.03.2024
Сообщений: 3

Обновить таблицу по шаблону: update table1 table2 array where name in array

Подскажите пожалуйста, вот такая ситуация: нужно обновить две таблицы массивом данных с условием где одно из полей таблицы содержит массив совпадений, делаю вот как:


foreach ($daichi_product['Result'] as $item) {
                if($item['STORE']['NAME'] == 'Екатеринбург'){
                    foreach($productName3 as $val){
                        if($item['NAME'] == $val){
                            $priceCountDaichi[] = "`aventa_products`.`price` = '".$item['PRICES']['mprc']['PRICE']."', `aventa_pp_availability`.`count` = '".$item['STORE']['STORE_AMOUNT']."'";
                        }
                    }
                }
            }
            $updateFieldsPriceCount = implode (', ', $priceCountDaichi);
 
            $updatePriceProductDaichi = "UPDATE `aventa_products` JOIN `aventa_pp_availability` ON `aventa_products`.`id` = `aventa_pp_availability`.`product_id` SET $updateFieldsPriceCount WHERE `aventa_products`.`name` IN ($sqlPartDaichi2)";
            //db()->query($updatePriceProductDaici);
            echo $updatePriceProductDaichi;
 

Вот что получается на выходе:

UPDATE `aventa_products` JOIN `aventa_pp_availability` ON `aventa_products`.`id` = `aventa_pp_availability`.`product_id` SET `aventa_products`.`price` = '56750.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '158400.00', `aventa_pp_availability`.`count` = '2', `aventa_products`.`price` = '175100.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '145990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '46300.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '46300.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '46300.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '86990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '33990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '34990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '31990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '37990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '79990.00', `aventa_pp_availability`.`count` = '2', `aventa_products`.`price` = '60490.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '38990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '32990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '170900.00', `aventa_pp_availability`.`count` = '3', `aventa_products`.`price` = '106900.00', `aventa_pp_availability`.`count` = '4', `aventa_products`.`price` = '106900.00', `aventa_pp_availability`.`count` = '4', `aventa_products`.`price` = '108400.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '180400.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '26990.00', `aventa_pp_availability`.`count` = '17', `aventa_products`.`price` = '29990.00', `aventa_pp_availability`.`count` = '50', `aventa_products`.`price` = '29990.00', `aventa_pp_availability`.`count` = '50', `aventa_products`.`price` = '37990.00', `aventa_pp_availability`.`count` = '34', `aventa_products`.`price` = '38490.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '101490.00', `aventa_pp_availability`.`count` = '8', `aventa_products`.`price` = '28990.00', `aventa_pp_availability`.`count` = '36', `aventa_products`.`price` = '42490.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '60990.00', `aventa_pp_availability`.`count` = '2', `aventa_products`.`price` = '51990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '30990.00', `aventa_pp_availability`.`count` = '47', `aventa_products`.`price` = '77990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '38990.00', `aventa_pp_availability`.`count` = '2', `aventa_products`.`price` = '59990.00', `aventa_pp_availability`.`count` = '1', `aventa_products`.`price` = '99990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '27490.00', `aventa_pp_availability`.`count` = '45', `aventa_products`.`price` = '50490.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '31990.00', `aventa_pp_availability`.`count` = '39', `aventa_products`.`price` = '28990.00', `aventa_pp_availability`.`count` = '17', `aventa_products`.`price` = '141500.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '186300.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '35290.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '173300.00', `aventa_pp_availability`.`count` = '5', `aventa_products`.`price` = '23990.00', `aventa_pp_availability`.`count` = '13', `aventa_products`.`price` = '144400.00', `aventa_pp_availability`.`count` = '4', `aventa_products`.`price` = '26490.00', `aventa_pp_availability`.`count` = '9', `aventa_products`.`price` = '48990.00', `aventa_pp_availability`.`count` = '18', `aventa_products`.`price` = '85800.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '198600.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '22490.00', `aventa_pp_availability`.`count` = '21', `aventa_products`.`price` = '199990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '92990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '23990.00', `aventa_pp_availability`.`count` = '11', `aventa_products`.`price` = '30490.00', `aventa_pp_availability`.`count` = '10', `aventa_products`.`price` = '46490.00', `aventa_pp_availability`.`count` = '27', `aventa_products`.`price` = '51990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '82490.00', `aventa_pp_availability`.`count` = '1', `aventa_products`.`price` = '107990.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '155990.00', `aventa_pp_availability`.`count` = '2', `aventa_products`.`price` = '30490.00', `aventa_pp_availability`.`count` = '22', `aventa_products`.`price` = '32990.00', `aventa_pp_availability`.`count` = '1', `aventa_products`.`price` = '41990.00', `aventa_pp_availability`.`count` = '29', `aventa_products`.`price` = '40490.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '42490.00', `aventa_pp_availability`.`count` = '35', `aventa_products`.`price` = '48490.00', `aventa_pp_availability`.`count` = '1' WHERE `aventa_products`.`name` IN ('FTYN25L/RYN25L/-40','FTYN25L/RYN25L/-40','FTYN35L/RYN35L/-40','FTYN50L/RYN50L/-40','FTYN60L/RYN60L/-40','Nobby Smart 24-2CSF','Kobold S-05','Kobold S-06','KSHE176HFAN3/KSUT176HFAN3','KSKS70HFAN1/KSUT70HFAN1','DA20AVQS1-S/DF20AVS1','DA25AVQS1-S/DF25AVS1','DA35AVQS1-S/DF35AVS1','DA50AVQS1-S/DF50AVS1','DA20AVQS1-W/DF20AVS1','DA25AVQS1-W/DF25AVS1','DA35AVQS1-W/DF35AVS1','DA60AVQS1-W/DF60AVS1','FTXF60A/RXF60B','MC55W','MCK55W','ICE35AVQ1/ICE35FV1','AIR35AVQS1R/AIR35FVS1R','KSGA26HZRN1/KSRA26HZRN1','KSGA53HZRN1/KSRA53HZRN1','KSGA70HZRN1/KSRA70HZRN1','KSGA21HFAN1/KSRA21HFAN1','KSGA26HFAN1/KSRA26HFAN1','KSGA35HFAN1/KSRA35HFAN1','KSGA53HFAN1/KSRA53HFAN1','KSGI21HFAN1/KSRI21HFAN1','KSGI26HFAN1/KSRI26HFAN1','KSGI26HFAN1/KSRI26HFAN1','MSAG1-07HRN1-I/MSAG1-07HRN1-O','MSAG1-09HRN1-I/MSAG1-09HRN1-O','MSAG1-12HRN1-I/MSAG1-12HRN1-O','MSAG1-18HRN1-I/MSAG1-18HRN1-O','MSAG1-12N8C2-I/MSAG1-12N8C2-O','MSAG1-24N8D0-I/MSAG1-24N8D0-O','FTXF25C/RXF25C','KSGI21HFAN1/KSRI21HFAN1/-40','ASX12D1/ASB12D1','ASX07DZ1R/ASB07DZ1R','ASX12DZ1R/ASB12DZ1R','AIR20AVQ1/AIR20FV1','AIR25AVQ1/AIR25FV1','AIR50AVQ1/AIR50FV1','ASX09D1Z1R/ASB09D1Z1R','Nobby Balance Plus 12-2CS','Nobby Balance Plus 18-2CS','Nobby Balance Plus 24-2CS','KSZTA53HFAN1/KSUTA53HFAN1/KPU65-D','KSVT105HFAN3/KSUR105HFAN3/KPU95-DR','KSVT140HFAN3/KSUT140HFAN3/KPU95-DR','KSVT176HFAN3/KSUT176HFAN3/KPU95-DR','KSGAA21HZRN1/KSRAA21HZRN1','KSGAA26HZRN1/KSRAA26HZRN1','KSGAA35HZRN1/KSRAA35HZRN1','KSGTI26HZRN1/KSRTI26HZRN1','KSGTI35HZRN1/KSRTI35HZRN1','KSGTI50HZRN1/KSRTI50HZRN1','KSGTI70HZRN1/KSRTI70HZRN1','KSGTI100HZAN1/KSRTI100HZAN1','KSGTI21HFAN1/KSRTI21HFAN1','KSGTI26HFAN1/KSRTI26HFAN1','KSGTI35HFAN1/KSRTI35HFAN1')
 

Но во всех товарах обновляет только последнюю цену и кол-во: aventa_products.price = '48490.00', aventa_pp_availability.count = '1' Что я пытаюсь сделать - я хочу вне цикла foreach делать обновление таблицы, чтобы повысить скорость запроса, но вот как это сделать?
Да, и еще, база данных - 5.5.51-MariaDB.

Неактивен

 

#2 02.03.2024 18:26:44

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

Re: Обновить таблицу по шаблону: update table1 table2 array where name in array

У вас в запросе в части SET несколько раз дублируется кусок
`aventa_products`.`price` = '56750.00', `aventa_pp_availability`.`count` = '0', `aventa_products`.`price` = '158400.00', `aventa_pp_availability`.`count` = '2', `aventa_products`.`price` = '175100.00', `aventa_pp_availability`.`count` = '0',
с разными значениями. Логично, что применяется последний набор значений.

Сделайте пример с минимальным набором тестовых значений в виде команд
create table ..
insert into ..
и покажите какой вы хотите получить результат.

Неактивен

 

#3 02.03.2024 18:36:07

RustHrust
Участник
Зарегистрирован: 02.03.2024
Сообщений: 3

Re: Обновить таблицу по шаблону: update table1 table2 array where name in array

Есть таблица:

aventa_products с:

id, price, name

И есть таблица:

aventa_pp_availability с:

product_id, count

А есть массив данных, которым нужно обновить эти две таблицы, в php коде выше я описал как я это делаю, естественно не получается и то что вы написали я понял это, но вопрос то в другом - как тогда написать правильный запрос?
В заголовке темы я написал пример шаблона, по которому нужно обновить данные, немного добавлю для уточнения:

update table1 table2 array['price'], array['count'] where name in (array['name'])

Неактивен

 

#4 02.03.2024 18:46:32

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

Re: Обновить таблицу по шаблону: update table1 table2 array where name in array

Для того, чтобы написать правильный запрос и нужен пример с данными, буквально на несколько строк, который проиллюстрирует проблему.

Неактивен

 

#5 03.03.2024 12:55:52

RustHrust
Участник
Зарегистрирован: 02.03.2024
Сообщений: 3

Re: Обновить таблицу по шаблону: update table1 table2 array where name in array

vasya Спасибо за то что пытаетесь помочь, я решил задачу вот таким образом:


            $sqlPartName = '';
            $casePrice = '';

            foreach($itemProduct as $item) {
                $name = $item['name'];
                $sqlPartName .= ($sqlPartName == '') ? "'$name'":','."'$name'";
                $price = $item['price']['ric'];
                $casePrice .= " WHEN '$name' THEN '$price'";
            }

            $updatePriceProduct = "UPDATE `products` set `price` = (CASE `name` $casePrice END) WHERE `name` IN ($sqlPartName)";
            db()->query($updatePriceProduct);
 

Там нужно было на самом деле для двух таблиц обновить, для второй по такому же принципу просто отдельно сделал. Работает всяко-разно шустрее нежели в цикле foreach обновлять.

Отредактированно RustHrust (03.03.2024 12:56:37)

Неактивен

 

Board footer

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