2013-12-20 2 views
0

, скажем, что у меня есть поле с именем «control». Если «control» имеет значение NULL, я должен обновить поля «control», «f1», «f2», «f3», «f4», «f5». Если «control» не равно null, мне нужно только обновить «f4» и «f5». Как я должен достичь этой цели? я пытался что-то вроде:mysql несколько обновлений, только если одно поле имеет нулевое значение

UPDATE table SET 
control = IF(control IS NULL, 1, do_nothing), 
f1 = IF(control IS NULL, value1, do_nothing), 
f2 = IF(control IS NULL, value2, do_nothing), 
f3 = IF(control IS NULL, value3, do_nothing), 
f4 = value4, 
f5 = value5 
WHERE id = XX 

но «контроль», как только быть установлен в 1 не равно нулю больше, так что другие обновления (но f4 и f5) не обрабатываются. Кроме того, как я могу сказать в инструкции if «do_nothing» на ветке ELSE? Путать. Я решил сделать выборку и вложенное обновление, но получил много ошибок. Спасибо всем

+0

Честно говоря, я бы просто использовать оператор обновления для f4 и f5, а затем отдельное заявление для других столбцов. Возможно, вам удастся получить один оператор обновления, который сделает все это, но зачем работать так сложно? – user1618143

+0

Упражнение :) Серьезно, потому что я хочу остаться «светлым» со страницей сценария, я хочу узнать что-то сложное о выражении UPDATE, которое мне не хватает, и потому, что я думаю, что он может быть элегантным, имея все в одном запросе. Я думаю, что у меня есть все инструменты для достижения этого, но я не могу их смешивать в правильном «рецепте» – Aptivus

ответ

0

Готово! Спасибо за совет. Кому может быть полезно:

DELIMITER | 

CREATE PROCEDURE `setLastLogin` 
(
    IN `ip_user` varchar(255), 
    IN `user_id` int 
) 
BEGIN 
    /* Procedure text */ 

    SELECT control INTO @con 
    FROM tbl_users 
    WHERE id = user_id; 

    IF (@con IS NULL) 
    THEN 
    UPDATE tbl_users 
    SET 
    control = 1, 
    date_control = NOW(), 
    ip_control = ip_user, 
    date_last_login = NOW(), 
    ip_last_login = ip_user 
    WHERE id = user_id; 
    ELSE 
    UPDATE tbl_users 
    SET 
    date_last_login = NOW(), 
    ip_last_login = ip_user 
    WHERE id = user_id; 

    END IF; 


END| 

DELIMITER ; 
0

Вы можете использовать хранимую процедуру, или это может быть достигнуто с помощью двух операторов.

UPDATE table SET 
control = 1, 
f1 = value1, 
f2 = value2, 
f3 = value3, 
f4 = value4, 
f5 = value5 
WHERE id = XX and control IS NULL 

и

UPDATE table SET 
f4 = value4, 
f5 = value5 
WHERE id = XX and control IS NOT NULL 
+0

Я сразу же попробую :) – Aptivus

0

Попробуйте что-нибудь подобное?

update table 
set f1 = case when control is null 
       then 'value1' else f1 
     end, 
    f2 = case when control is null 
       then 'value2' else f2 
     end, 
    f3 = case when control is null 
       then 'value3' else f3 
     end, 
    f4 = 'value4', 
    f5 = 'value5' 
where id = XX; 
0

Используйте условие IF:

IF control IS NULL AND ID=XX THEN UPDATE table SET 
    control = 1, 
    f1 = value1, 
    f2 = value2, 
    f3 = value3, 
    f4 = value4, 
    f5 = value5 

ELSEIF control IS NOT NULL THEN UPDATE table SET 
    f4 = value4, 
    f5 = value5 

END IF 
+0

хороший. Благодарю. Я закончил с хранимой процедурой, но ваш код - это то, что я изначально искал – Aptivus

Смежные вопросы