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

标签 mysql sql

我有一个 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_actionsaction_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/

相关文章:

php - 如何使用 PHP 和 MySql 在条件检查中使用 SELECT 和 WHERE & AND

MYSQL - 在选择查询中使用带有正则表达式的变量来获取记录

sql - 查找字符串中以元音开头的单词数

mysql - 总结每个用户的最新记录

python - Django 的逻辑或多对多查询返回重复结果

mysql - rake db :migrate error: db_development. 位置不存在:显示 `locations` 的完整字段

php - $_POST 如何将输入变量作为整数而不是 1 传递给 MySQL 查询?

php - 显示另一个表中的畅销商品和关联图像

sql - 查找具有值 A 的行和值 B 的行的所有 ID

c# - 如果使用 MySQL 连接器,用户可以从我的软件中获取数据库信息吗