我有一个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
希望这能满足我的需求?任何帮助,将不胜感激!一整天都在反对这个问题。
答案 0 :(得分:1)
使用子查询加入department_members
,该子查询使用action_id
计算表company_actions
中LEFT 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)