#mysql #update #if #else
UPDATE personal_card SET if bank_book >= price_tariff bank_book = bank_book - price_tariff, bank_pay = bank_pay + price_tariff, stop_date = DATE_ADD(CURDATE(),Interval 1 MONTH) else pay_status = '0' WHERE stop_date = CURDATE() Не могу разобраться в условиях IF ELSE, проверяем bank_book >= price_tariff, если TRUE до выполняем условие, если нет, то изменяем pay_status = '0'. Понимаю что можно сделать двумя разными запросами, но мне кажется что в одном, это правильнее. Спасибо!
Ответы
Ответ 1
Дополнительная переменная заведена чтобы не выполнять проверку для всех полей, а только один раз на строку. Первый вариант: SET @MyVar = 1; UPDATE personal_card SET bank_book = IF(@MyVar := bank_book >= price_tariff, bank_book - price_tariff, bank_book), bank_pay = IF(@MyVar, bank_pay + price_tariff, bank_pay), stop_date = IF(@MyVar, DATE_ADD(CURDATE(),Interval 1 MONTH), stop_date), pay_status = IF(@MyVar, 1, 0) WHERE stop_date = CURDATE() Второй вариант: SET @MyVar = 1; UPDATE personal_card SET bank_book = (CASE WHEN @MyVar := bank_book >= price_tariff THEN bank_book - price_tariff ELSE bank_book END), bank_pay = (CASE WHEN @MyVar THEN bank_pay + price_tariff ELSE bank_pay END), stop_date = (CASE WHEN @MyVar THEN DATE_ADD(CURDATE(),Interval 1 MONTH), ELSE stop_date END), pay_status = (CASE WHEN @MyVar THEN 1 ELSE 0 END) WHERE stop_date = CURDATE(); Третий вариант: UPDATE personal_card SET bank_book = bank_book - price_tariff, bank_pay = bank_pay + price_tariff, stop_date = DATE_ADD(CURDATE(),Interval 1 MONTH), pay_status = 1 WHERE bank_book >= price_tariff AND stop_date = CURDATE(); UPDATE personal_card SET pay_status = 1 WHERE bank_book < price_tariff AND stop_date = CURDATE();Ответ 2
UPDATE personal_card SET bank_book = IF(bank_book >= price_tariff, bank_book - price_tariff, bank_book), bank_pay = IF(bank_book >= price_tariff, bank_pay + price_tariff, bank_pay), stop_date = IF(bank_book >= price_tariff, DATE_ADD(CURDATE(),Interval 1 MONTH), stop_date), pay_status = IF(bank_book >= price_tariff, '0', '1') WHERE stop_date = CURDATE() Сделал так. На сколько это грамотно? Если будет более 1000 строк?
Комментариев нет:
Отправить комментарий