Mysql 从组id为NULL的记录中减去组id为NULL的记录的值不为NULL

Mysql 从组id为NULL的记录中减去组id为NULL的记录的值不为NULL,mysql,sql,Mysql,Sql,我试图将“group_id”不为NULL的记录的“count”字段从group_id为NULL的记录的同一字段中减去,因为这两个字段的日期相同 CREATE TABLE `test` ( `date` date NOT NULL, `group_id` int(11) DEFAULT NULL, `count` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; I

我试图将“group_id”不为NULL的记录的“count”字段从group_id为NULL的记录的同一字段中减去,因为这两个字段的日期相同

CREATE TABLE `test` (
  `date` date NOT NULL,
  `group_id` int(11) DEFAULT NULL,
  `count` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `test` (`date`, `group_id`, `count`) VALUES
('2021-05-15', NULL, 3),
('2021-05-15', 1, 2),
('2021-05-15', 2, 1);
基本上,它应该从3中减去2和1,并将3更新为0。 所以我做了一个内部连接:

UPDATE test AS t1
INNER JOIN test t2 
SET t2.count = t2.count - t1.count
WHERE 
    t1.group_id IS NOT NULL AND 
    t2.group_id IS NULL AND 
    t1.date = t2.date;
它处理2条记录,但处理3条记录,就像在我的示例中一样,它忽略了组为2的第二条记录。因此,结果是count=3变为1,而不是0

如何正确地修复它?添加另一个内部联接,否则我应该使用不同的方法?(仅限2条以上的group_id不为空记录)


另外,对于每个日期,只有一个组id为空的记录。

我认为您希望在加入之前聚合:

UPDATE test t1 JOIN
       (SELECT date, SUM(count) as cnt
        FROM test t2 
        WHERE group_id IS NULL
        GROUP BY date
       ) t2
       ON t1.date = t2.date
    SET t1.count = t1.count - t2.count
WHERE t1.group_id IS NULL ;