Помогите с SQL запросом

Lord Maverik
На сайте с 15.04.2003
Offline
471
647

запрос такой:


UPDATE `shop_list` as `sl` LEFT JOIN `Prices` as `pr` ON `sl`.`icode`=`pr`.`nCode` SET `sl`.`price`=`pr`.`price` where `pr`.`tCode`='base'";

Этот запрос обновляет цену в таблице товаров, по данным из таблицы цен.

Но когда в таблице цен, для одного товара есть несколько вариантов, разных, то нужно, чтобы была выбрана наибольшая цена.

Т.е. надо

 ORDER BY `pr`.`price`

но куда вставить эту сортировку не пойму вообще, и можно ли так.

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
dimidrol
На сайте с 29.09.2005
Offline
191
#1

А не проще создавать временную таблицу и туда выкидывать уникальные записи с максимальной ценой и по ней менять уже основную таблицу?

Иногда полезно проигрывать - это держит тебя в тонусе... Мне так рассказывали (с) Shark Покупаю сайты (стройка/отделка/стройматериалы) по адекватной цене. Предложения в личку. Траф - обязателен
S
На сайте с 23.05.2004
Offline
315
#2

В конце UPDATE и вставить. Только добавить LIMIT 1, что бы только одна запись обновлена.

Т.е. в общей сложности "order by price desc limit 1" .

Правда не уверен, что на всех версиях mysql это сработает. Вообще так лучше не делать, а выбрать сначала запись а потом ее уже и обновить.

Это просто подпись.
[Удален]
#3

да .. задачка ..

для записей tCode = 'base'


UPDATE shop_list as sl LEFT JOIN ( SELECT Prices.nCode, MAX( Prices.price ) `max_price` FROM Prices WHERE Prices.tCode='base' GROUP BY Prices.nCode ) AS pr ON sl.icode=pr.nCode SET sl.price=pr.max_price where pr.max_price is NOT NULL;

или для всех если убрать:


WHERE Prices.tCode='base'
edogs software
На сайте с 15.12.2005
Offline
775
#4
Lord Maverik:
запрос такой:

UPDATE `shop_list` as `sl` LEFT JOIN `Prices` as `pr` ON `sl`.`icode`=`pr`.`nCode` SET `sl`.`price`=`pr`.`price` where `pr`.`tCode`='base'";


Этот запрос обновляет цену в таблице товаров, по данным из таблицы цен.
Но когда в таблице цен, для одного товара есть несколько вариантов, разных, то нужно, чтобы была выбрана наибольшая цена.
Т.е. надо
 ORDER BY `pr`.`price`

но куда вставить эту сортировку не пойму вообще, и можно ли так.

Мы бы попробовали примерно так


update shop_list set shop_list.price= (
select max(Prices.price) where shop_list.icode=Prices.nCode and Prices.tCode='base'
)

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

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
[Удален]
#5
edogs:
Мы бы попробовали примерно так

Или я что-то не понимаю или эта запись выдаст syntax error ( по нескольким причинам ), но даже если бы сработала, все записи в shop_list стали бы одной величиной.

edogs software
На сайте с 15.12.2005
Offline
775
#6
imagine:
Или я что-то не понимаю или эта запись выдаст syntax error ( по нескольким причинам )

Только по одной, мы забыли указать таблицу Prices:)

Надо не

select max(Prices.price)

а

select max(Prices.price) from Prices

imagine:
но даже если бы сработала, все записи в shop_list стали бы одной величиной.

Не-а. Условие внутри отрабатывает.

Единственный нюанс, это что занулит цены в shop_list в случае если нет значений в Prices, но тут трудно сказать баг это или фича, да и добавить условие несложно.

Lord Maverik
На сайте с 15.04.2003
Offline
471
#7

Спасибо всем, опробую варианты :)

Lord Maverik
На сайте с 15.04.2003
Offline
471
#8

Возвращаюсь к своему вопросу:


UPDATE `shop_list` as `sl` LEFT JOIN `Prices` as `pr` ON `sl`.`icode`=`pr`.`nCode` SET `sl`.`price_mag`=`pr`.`price` where `pr`.`tCode`='base' ORDER BY `pr`.`price` LIMIT 1

Не работает:

#1221 - Incorrect usage of UPDATE and ORDER BY
UPDATE shop_list as sl LEFT JOIN ( SELECT Prices.nCode, MAX( Prices.price ) `max_price` FROM Prices WHERE Prices.tCode='base' GROUP BY Prices.nCode ) AS pr ON sl.icode=pr.nCode SET sl.price=pr.max_price where pr.max_price is NOT NULL;

Запрос выполняется. У меня записей 40000+в shop_list и 118000+ в Prices. Пишет обновлено 180 записей. Нужную задачу не выполняет.


update shop_list set shop_list.price= (
select max(Prices.price) from Prices where shop_list.icode=Prices.nCode and Prices.tCode='base'
)

Может быть и работает, но mysql сервер просто умирает :(

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