【问题标题】:Subtracting value of the record with group_id IS NOT NULL from group_id IS NULL从 group_id IS NULL 中减去 group_id IS NOT NULL 的记录值
【发布时间】:2021-05-15 05:35:38
【问题描述】:

我正在尝试从 group_id 为 NULL 的同一记录字段中减去“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。 所以我用 INNER JOIN 做到了:

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 条记录,就像在我的示例中一样,它会忽略 group_id=2 的第二条记录。所以结果是 count = 3 变成了 1 而不是 0。

如何正确修复它?添加另一个 INNER JOIN 或者我应该使用不同的方法? (只是可能超过 2 个 group_id IS NOT NULL 记录)

附:每个日期只有 1 条 group_id 为 NULL 的记录。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我想你想在加入之前进行汇总:

    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 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多