Страницы

Поиск по вопросам

Показаны сообщения с ярлыком else. Показать все сообщения
Показаны сообщения с ярлыком else. Показать все сообщения

понедельник, 2 марта 2020 г.

UPDATE IF ELSE Mysql

#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 строк?

пятница, 10 января 2020 г.

Как упростить многочисленные else if?

#php #if #else


Есть динамические данные от пользователя, которые на сервере необходимо проверять
на вхождение в тот или иной диапазон и в зависимости от этого выводить разный результат.

Мне в голову приходит только (пример условный):

if($var < 1000) {
    do one
}
else if ($var < 2000) {
    do two
}
else if ($var < 3000) {
    do three
}
.... и т.д.


Подскажите, как упростить такую конструкцию?
    


Ответы

Ответ 1



Поскольку автор по какой-то причине упорно не признается, какой именно результат ему надо выводить, придется фантазировать. В случае, если надо просто вывести некий текст, нам пригодятся такие познания из курса начальной школы, как деление и округление. $results = [ "Герой пионерского лагеря", "Дважды герой пионерского лагеря", "Многократный призер куличиков и совочка", ] $place = floor($var / 1000); echo $results[$place] ?? 'Завхоз по наградам';

среда, 20 февраля 2019 г.

Как упростить многочисленные else if?

Есть динамические данные от пользователя, которые на сервере необходимо проверять на вхождение в тот или иной диапазон и в зависимости от этого выводить разный результат.
Мне в голову приходит только (пример условный):
if($var < 1000) { do one } else if ($var < 2000) { do two } else if ($var < 3000) { do three } .... и т.д.
Подскажите, как упростить такую конструкцию?


Ответ

Поскольку автор по какой-то причине упорно не признается, какой именно результат ему надо выводить, придется фантазировать.
В случае, если надо просто вывести некий текст, нам пригодятся такие познания из курса начальной школы, как деление и округление.
$results = [ "Герой пионерского лагеря", "Дважды герой пионерского лагеря", "Многократный призер куличиков и совочка", ] $place = floor($var / 1000); echo $results[$place] ?? 'Завхоз по наградам';