mysql - UPDATE JOIN 表,数学运算只发生在单个(最后?)行

标签 mysql sql

在我的应用程序中,我跟踪用户的未读通知总数以及用户表中的其他用户数据。通知在单独的表中,类似性质的通知堆叠在一行中,每行跟踪计数和最后一个时间戳。现在我想实现一个功能,将所有通知标记为已读,直到特定的时间戳。我使用来自两个不同表的两列之间的数学减法进行了此查询:

        UPDATE 
            core_notification n
        LEFT JOIN 
            core_user u
        ON 
            n.notification__user_id = u.user__id
        SET
            n.notification__if_read = 1,
            u.user__notification_unread_count = u.user__notification_unread_count - n.notification__main_count
        WHERE
            n.notification__timestamp <= 123456 AND
            n.notification__if_read = 0 AND
            n.notification__user_id = 123;

问题:假设在用户表中“user__notification_unread_count”的值为 4,并且有两个通知的“notification__main_count”值为 2。运行此查询并将两个通知更新为已读后,我的目标是让“user__notification_unread_count”值为 0 (4 - 2 - 2 = 0)。但是结果总是 2。我尝试了各种连接方法,但似乎这就是更新多行时数据库的工作方式(每个更新的行都会完全覆盖以前的更新,但这只是我的假设)。 有没有一种方法可以通过单个查询获得我想要的结果?

最佳答案

在这种情况下,您最好使用触发器。但 。 . .您可以在一次更新中完成,只是需要做更多的工作:

UPDATE core_notification n LEFT JOIN 
       core_user u
       ON n.notification__user_id = u.user__id LEFT JOIN
       (SELECT n2.notification__user_id,
               SUM(n2.notification__main_count) as total_notification__main_count
        FROM core_notification n2
        WHERE n2.notification__timestamp <= 123456 AND
              n2.notification__if_read = 0 AND
              n2.notification__user_id = 123;
        GROUP BY n2.notification__user_id
       ) n2
       ON n2.notification__user_id = n2.notification__user_id
SET n.notification__if_read = 1,
    u.user__notification_unread_count = u.user__notification_unread_count - n2.total_notification__main_count
WHERE n.notification__timestamp <= 123456 AND
      n.notification__if_read = 0 AND
      n.notification__user_id = 123;

n2派生表单独计算需要减去的总数。

关于mysql - UPDATE JOIN 表,数学运算只发生在单个(最后?)行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58188798/

相关文章:

javascript - 如何在 JavaScript 中将 MySQL DATETIME 值转换为 json 格式

mysql - 关系数据库中的时区混淆

php - 按类别对mysql结果进行分组,并在每个类别下分组显示

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 面试中的 SQL 任务

C# MySQL 错误 "Column count doesn' t 匹配第 1 行的值计数"

sql - MySQL,如果一个单词在列中出现多次,则选择表

mysql - 按两列更新累积和

php - 更新先前使用 MYSQL 和 PHP 选择的一组行

mysql - INNER JOIN 同一张表