2009-12-11 14 views
7

Nie jestem nawet pewien, czy jest to możliwe, ale próbuję wykonać inną aktualizację, jeśli spełniony jest określony warunek.Aktualizacja MySQL przy użyciu warunku IF

użytkownika [id, data_początkowa (nie NULL) end_date (NULL) przyczynę (NULL) .....]

user_roles [id, ROLE_ID, id_użytkownika, data_początkowa (nie NULL) end_date (NULL)]

Co mam teraz jest to, ale to działa tylko jeśli istnieje rola dla użytkownika i to end_date jest NULL:

UPDATE user p 
JOIN user_roles ur ON p.id = ur.user_id 
SET ur.end_date = NOW() 
    , p.end_date = NOW() 
    , p.reason = "Retired" 
WHERE p.id = 5 
AND ur.end_date IS NULL 

Myślałam o zrobienie czegoś takiego:

IF EXISTS (SELECT id FROM user_roles 
WHERE user_id = 5 AND end_date IS NULL) 
THEN 
    UPDATE user p 
    JOIN user_roles ur ON p.id = ur.user_id 
    SET ur.end_date = NOW() 
     , p.end_date = NOW() 
     , p.reason = "Retired" 
    WHERE p.id = 5 AND ur.end_date IS NULL 
ELSE 
    UPDATE user 
    SET end_date = NOW() 
     , reason = "Retired" 
    WHERE id = 5 
END IF 
+0

@APC, robiłem to samo =) –

Odpowiedz

14

Ponieważ jedyną różnicą jest to, czy ustawienie ur.end_Date albo do aktualnej daty lub ustawienie na nim data istniejących można nie tylko korzystać z następującą:

UPDATE user p 
JOIN user_roles ur 
ON p.id = ur.user_id 
SET 
ur.end_date = IF (ur.end_date IS NULL, NOW(), ur.end_date), 
p.end_date = NOW(), 
p.reason = "Retired" 
WHERE p.id = 5 
+0

To ma znacznie więcej sensu ... działa idealnie. Dzięki Martin !! – moleculezz