我有一个 MySQL 表 department_members
,其中包含每个人的字符串字段 (member_name
) 和 int 字段 (recent_actions
) 的行在一个部门。目前,所有行的 Recent_actions
均为 NULL。
我有另一个更大的表company_actions
,其中包含一行,表示整个公司中的某个人在过去一年中执行了此类操作。每行都有一个member_name、时间戳
和一个唯一的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
希望这能明白我的目的吗?任何帮助,将不胜感激!一整天都在为这个问题绞尽脑汁。
最佳答案
将 department_members
与子查询连接起来,该子查询使用 LEFT JOIN
计算表 company_actions
中 action_id
的总数。
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)
关于mysql - 如果字符串匹配,则使用子查询的计数更新 MySQL 表,否则设置为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531055/