如果字符串匹配,则使用子查询中的计数更新MySQL表,否则设置为零

时间:2013-10-23 01:11:32

标签: mysql sql

我有一个MySQL表department_members,其中包含一个字符串字段(member_name)和一个int字段(recent_actions)的行,用于单个部门中的每个人。所有行的Recent_actions当前为NULL。

我有另一个更大的表company_actions,每当整个公司的某个人在过去一年中执行过这种类型的操作时,它就会包含一行。每行都有一个member_name, timestamp,和一个唯一的action_id

我想更新department_members.recent_actions,并计算该成员在过去两周内执行该类型操作的次数。如果他们最近没有执行任何操作,我想将department_members.recent_actions更新为0。

我尝试了各种CASE和IF方法,但我无法正确使用语法。

在伪代码中,这就是我要做的事情:

UPDATE department_members AS d,
  (SELECT COUNT(action_id) AS recent, member_name 
      FROM company_actions 
         WHERE timestamp > DATE_SUB(NOW(), INTERVAL 14 DAY) AS tmp
/* then do something like this, only for real: */
IF d.member_name IN tmp(member_names) THEN d.recent_actions = tmp.recent 
    WHERE d.member_name = tmp.member_name
ELSE IF d.member_name NOT IN tmp(member_names) THEN d.recent_actions = 0

希望这能满足我的需求?任何帮助,将不胜感激!一整天都在反对这个问题。

1 个答案:

答案 0 :(得分:1)

使用子查询加入department_members,该子查询使用action_id计算表company_actionsLEFT JOIN的总数。

COALESCE()返回 params 列表中的第一个非空值。

UPDATE  department_members a
        LEFT JOIN 
        (
            SELECT  member_name, COUNT(*) TotalAction
            FROM    company_actions
            WHERE   timestamp > DATE_SUB(NOW(), INTERVAL 14 DAY)
            GROUP   BY member_name
        ) b ON a.member_name = b.member_name
SET     a.action_id = COALESCE(b.TotalAction, 0)