UPDATE IF ELSE Mysql

201
01 марта 2018, 10:32
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'. Понимаю что можно сделать двумя разными запросами, но мне кажется что в одном, это правильнее.

Спасибо!

Answer 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();
Answer 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 строк?

READ ALSO
Запись в MySQL в разные таблицы

Запись в MySQL в разные таблицы

Я парсю сайтМне нужно распарсить 2 категории Fresh и Bekery и занести данные в БД

215
НЕ могу понять ошибку в написании триггера mysql

НЕ могу понять ошибку в написании триггера mysql

При добавлении новой строки в таблицу выскакивает ошибка ERROR 1442 (HY000): Can't update table 'parts' in stored function/trigger because it is already used by statement which invoked this stored...

144
Вычитание значений между таблицами Mysql

Вычитание значений между таблицами Mysql

Есть 2 идентичные по полям таблицы в одной БДsirovyna и zayavki

128
Дозапись в текстовый файл

Дозапись в текстовый файл

Не могу понять как модернизировать код, чтобы сделать дозапись в файл без использования проверки на существование файла

155