Двойной update с использованием данных из обеих таблиц

PAG

Новичок
Двойной update с использованием данных из обеих таблиц

Приветствую!
Подскажите, как красиво решить проблему:

есть две таблицы, связанные по ключам.
b_user и gp_users

в одной хранится текущее значение, а в другой накопленное.
необходимо по всем пользователям пройти и обновить данные. есть определенный порог - для примера 50, который нужно сохранить в текущей таблице (gp_users), если там уже больше, то излишек перенести в накопленное (приплюсовать к значению в b_user), если же в текущей не хватает, то недостающее взять из накопенного.

делаю я это все таким запросом:

UPDATE b_user AS ua, gp_users AS gu SET ua.BONUS_CACHE=ua.BONUS_CACHE+gu.value-LEAST(GREATEST(50,IF(ua.PE_CUR_WEEK>0,ua.PE_CUR_WEEK,999999999999)),gu.value+ua.BONUS_CACHE), gu.fixvalue=LEAST(GREATEST(50,IF(ua.PE_CUR_WEEK>0,ua.PE_CUR_WEEK,999999999999)),gu.value+ua.BONUS_CACHE) WHERE ua.ID=gu.b_user_id AND gu.week=2
и он нормально работает, но проблема в том, что если во временной таблице не хватает какого-то пользователя, то он и не обрабатывается, а мне нужно для таких добавлять сумму из накопительной таблицы.

я думал делать дополнительную вставку пустых строчек в текущую таблицу, но это как-то криво... да и как их туда вставить нормально? не приходит на ум.

подскажите, можно ли сделать это все одним запросом?
 

DiMA

php.spb.ru
Команда форума
> но проблема в том, что если во временной таблице не хватает какого-то пользователя, то он и не обрабатывается

изучи следующее:
REPLACE
LOCK TABLES
INSERT IGNORE (хотя, не рекомендуется)

Задача решается либо REPLACE, когда можно без доп. запроса откуда-то узнать состояние неиспользуемых полей (или их нет), либо блокировкой (если возможно параллельное исполнение кода) и SELECT, а далее либо INSERT(или REPLACE), либо UPDATE(или REPLACE).

Replace позволяет апдейтить или вставлять не читая, insert ignore - вставлять дефолтные значения без проверки существования.
 

x-yuri

Новичок
DiMA, но ведь человеку надо 2 таблицы обновить, т.е. REPLACE самого по себе не достаточно? Может перед UPDATE с помощью INSERT IGNORE создать недостающие записи в текущую таблицу? Потому как варианта с одним запросом я не вижу
 

PAG

Новичок
Возможно, Вы не так меня поняли. Апдейтить нужно ту таблицу, в которой все записи есть, просто в силу такой конструкции запроса (он выдает все записи, которые есть и там, и там) игнорируются и не обновляются записи, которых нет во временной таблице. Вот если бы в запросе апдейта можно было использовать джойн, было бы проще...

-~{}~ 27.01.09 14:51:

Автор оригинала: x-yuri
DiMA, но ведь человеку надо 2 таблицы обновить, т.е. REPLACE самого по себе не достаточно? Может перед UPDATE с помощью INSERT IGNORE создать недостающие записи в текущую таблицу? Потому как варианта с одним запросом я не вижу
Да, вот я про это думал. Использовать INSERT IGNORE мысль хорошая, спасибо! Как первый вариант попробую.
 
Сверху