Mysql 用CASE更新表

Mysql 用CASE更新表,mysql,sql,stored-procedures,sql-update,case,Mysql,Sql,Stored Procedures,Sql Update,Case,我有两个表user\u master和login\u history。在User_master中,如果用户已在登录历史记录的当前日期登录,则我希望将状态列更新为Aabsent或PPresent。我正在尝试的代码将更新所有行。我想要的是,如果用户已经登录,它应该匹配这两个表,并将user_master status列更新为P或A。希望我的问题是清楚的。非常感谢您的帮助。这是我的MySQL查询 UPDATE User_master a INNER JOIN ( SELECT DIS

我有两个表user\u master和login\u history。在User_master中,如果用户已在登录历史记录的当前日期登录,则我希望将状态列更新为Aabsent或PPresent。我正在尝试的代码将更新所有行。我想要的是,如果用户已经登录,它应该匹配这两个表,并将user_master status列更新为P或A。希望我的问题是清楚的。非常感谢您的帮助。这是我的MySQL查询

 UPDATE User_master a
 INNER JOIN 
  (
    SELECT DISTINCT user_name FROM login_history  WHERE DATE(`login_time`)=CURRENT_DATE()
  ) b

SET a.`user_status` = CASE 
   WHEN a.`user_name`=B.`user_name` THEN 'P'
   WHEN a.`user_name`!=B.`user_name` THEN 'A'
 END
嗯,我在想左联合:

我突然想到,在给定的日期可能有多个登录名。结果是在同一行上进行其他更新。您可以通过执行以下操作来防止这种情况:

UPDATE User_master m LEFT JOIN
       (SELECT lh.user_name, 'P' as user_status
        FROM Login_History lh
        WHERE lh.login_time >= CURRENT_DATE() AND
              lh.login_tie < DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY)
        GROUP BY lh.user_name
       ) lh
       ON m.user_name = lh.user_name 
    SET m.user_status = COALESCE(lh.user_status, 'A');
请注意,我还更改了日期算术。这个版本应该更好地使用索引。

Hmmm,我想左连接:

我突然想到,在给定的日期可能有多个登录名。结果是在同一行上进行其他更新。您可以通过执行以下操作来防止这种情况:

UPDATE User_master m LEFT JOIN
       (SELECT lh.user_name, 'P' as user_status
        FROM Login_History lh
        WHERE lh.login_time >= CURRENT_DATE() AND
              lh.login_tie < DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY)
        GROUP BY lh.user_name
       ) lh
       ON m.user_name = lh.user_name 
    SET m.user_status = COALESCE(lh.user_status, 'A');

请注意,我还更改了日期算术。此版本应更好地使用索引。

使用两个查询可能更容易:

设置每个人缺席更新。。。设置用户_status='A' 使用选择集将当前人员设置为P。 像这样:

update user_master set user_status='A';

update user_master set user_status='P'
where user_name in (select distinct user_name from login_history...);

连接稍微快一点,但这是一种非常干净、易懂的方法。

使用两个查询可能更容易:

设置每个人缺席更新。。。设置用户_status='A' 使用选择集将当前人员设置为P。 像这样:

update user_master set user_status='A';

update user_master set user_status='P'
where user_name in (select distinct user_name from login_history...);
连接稍微快一些,但这是一种非常干净、可以理解的方法