2009-12-11 8 views
7

Je ne suis même pas sûr si c'est possible mais j'essaie de faire une mise à jour différente si une certaine condition est remplie.MySQL UPDATE en utilisant la condition IF

utilisateur [id, start_date (NOT NULL), date_fin (NULL), la raison (NULL), .....]

user_roles [id, role_id, user_id, start_date (NOT NULL), date_fin (NULL)]

ce que j'est en ce moment cela, mais cela ne fonctionne que si un rôle existe pour l'utilisateur et il est date_fin est 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 

Je pensais faire quelque chose comme ceci:

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, je faisais même chose = –

Répondre

14

Étant donné que la seule différence est que vous définissez ur.end_Date soit la date ou la mise à jour c'est déjà pourriez-vous pas seulement utiliser les éléments suivants:

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

Cela fait beaucoup plus de sens en effet ... cela fonctionne parfaitement. Merci Martin !! – moleculezz