PDA

Просмотр полной версии : mysql UPDATE



berkut
13.12.2004, 16:43
помогите пожалуйста составить запрос.
есть
stat:
partner_id | day | day_amount
и
partners
id | total_amount

нужно обновить total_amount
по следующему прниципу -
total_amount=total_amount+(day_amount*someval-day_amount) where day = anotherval
т.е. выбрать day_amount, умноженное на someval для каждого partner_id, где day равен тому-то, и приплюсовать все это к total_amount cоответственно для каждого id
подскажите как сделать?я вообще в тупике, из доки я понял что с update вообще нельзя использовать ни join, ни union.

Absurd
13.12.2004, 18:03
я вообще в тупике, из доки я понял что с update вообще нельзя использовать ни join, ни union
Не надо было использовать такое говно, как MySQL.
Тут можно только идти по резалтсету одной таблицы, и по выфетченным значениям делать апдейты другой таблицы.
Но возникает ряд принципиальных вопросов:
1) Многопользовательский доступ. Что будет, если в момент, когда один пользователь делает тучу апдейтов, другой запустит тучу апдейтов по тем же таблицам? Можно блокировать таблицы (LOCK TABLE), но это хреновое решение.
2) Что случится, когда во время Такого вот обновления грохнется обновляющий процесс? Половина данных будет обновлена, половина нет. Нормальных транзанкций ведь в MySQL нет.

berkut
13.12.2004, 19:29
Absurd, Многопользовательский доступ в данном случае не проблема, ибо такую роцедуру может запустить только админ. использую mysql,т.к. выбора нет.

Тут можно только идти по резалтсету одной таблицы, и по выфетченным значениям делать апдейты другой таблицы
ты имеешь в виду что-то типа этого:
$res = mysql_query('SELECT * FROM stat WHERE day = someval');
while($row = mysql_fetch_assoc($res))
mysql_query('UPDATE partners SET total_amount=total_amount+$row['day_amount'] where id = $row['partner_id']')
или всё-таки можно как-то всё это провернуть, без запросов в цикле?

Absurd
14.12.2004, 10:18
можно как-то всё это провернуть, без запросов в цикле?
Обычно все юзают какое-нибудь говно мамонта типа 3.x.x. Но если у тебя версия поновей, то не все может и потеряно.

(Из документации)

Starting with MySQL 4.0.4, you can also perform UPDATE operations that cover multiple tables:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;