Одним UPDATE надо решить следующую проблему:
Если m_bid != 0 - записать это значение в smax.
Иначе, записать в smax наименьшее из двух значений: m_bid из shops_table, либо max * bid_part. Я пробовал справиться с этим на тестовых таблицах и по частям. Такой UPDATE:
UPDATE cat_table t0
JOIN (
SELECT sid, m_bid, max, bid_part
FROM cat_table
) t1
SET t0.smax=
CASE
WHEN t1.m_bid!=0 THEN t1.m_bid
ELSE
CASE
WHEN 1<t1.max*t1.bid_part THEN 1
ELSE t1.max*t1.bid_part
END
END;
Отрабатывает корректно. Начинаю усложнять:
UPDATE cat_table t0
JOIN (
SELECT sid, m_bid, max, bid_part
FROM cat_table
) t1
JOIN (
SELECT m_bid
FROM shops_table sh
WHERE t1.sid=sh.sid
) t2
SET t0.smax=
CASE
WHEN t1.m_bid!=0 THEN t1.m_bid
ELSE
CASE
WHEN t2.m_bid<t1.max*t1.bid_part THEN t2.m_bid
ELSE t1.max*t1.bid_part
END
END;
Ошибка
ERROR 1054 (42S22): Unknown column 't1.sid' in 'where clause'
Что мешает ему "зацепить" sid из первого SELECT? Как исправить?
Так?
UPDATE
cat_table t0
JOIN shops_table sh ON (
t0.sid=sh.sid
)
SET t0.smax =
IF(
t0.m_bid != 0,
t0.m_bid,
LEAST(sh.m_bid, t0.max*t0.bid_part)
)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей