【问题标题】:How can I sum and then remove duplicate fields MySql?如何求和然后删除重复的字段 MySql?
【发布时间】:2016-08-18 23:40:19
【问题描述】:

很抱歉,如果结果是重复的,但我很难找到确切的答案...

我有一个包含'email'(varchar) 和'clicks'(int) 的表格。

电子邮件字段包含电子邮件值的重复实例。我想删除重复项并只保留一个实例,但还要对给定电子邮件实例的“点击”中找到的所有值求和,并更新剩余记录以反映这一点。

我可以使用 distinct 和 group by 来查看我所追求的记录,它是我难以理解的总和和更新部分。

谢谢。

【问题讨论】:

  • 你说你可以使用distinctgroup by。这是正确的轨道。你能告诉我们你在尝试这些事情时使用的代码吗?

标签: mysql


【解决方案1】:

我认为您不需要在此处使用 DISTINCT,而是您可以对每个 email 值进行分组,同时获取点击的总和:

SELECT email, SUM(clicks) AS clickSum
FROM yourTable
GROUP BY email

当您提到“剩余”记录时,您忽略了重复记录是如何被删除的。选择性地删除除一个重复记录之外的所有记录将是一项繁重的工作。我可以通过将上述查询插入新表、删除旧表并将新表重命名为旧表来解决此问题:

CREATE TABLE yourNewTable (`email` varchar(255), `clicks` int);
INSERT INTO yourNewTable (`email`, `clicks`)
SELECT email, SUM(clicks)
FROM yourTable
GROUP BY email

DROP TABLE yourTable
ALTER TABLE yourNewTable RENAME TO yourTable

【讨论】:

  • 就是这样。谢谢蒂姆。我盯着它看太久了,在添加更新时被坑了。最好只提取并计算结果并将它们粘贴到临时表中,然后覆盖。
【解决方案2】:

仅通过更多点击更新电子邮件。

UPDATE yourTable a 
JOIN (SELECT email, 
             MAX(clicks) as m_clicks, 
             SUM(clicks) as s_clicks
      FROM yourTable
      GROUP BY email) b
  ON a.email = b.email
 AND a.clicks = b.m_clicks
SET a.clicks = b.s_clicks;

然后DELETE

DELETE yourTable a
LEFT JOIN   yourTable b
       ON   a.clicks > b.clicks
WHERE b.clicks is NOT NULL

编辑

我只是意识到你可以有两行具有相同的点击次数。这就是为什么您应该始终有一个 ID 列用作 PK

因此您可以添加以消除任何重复。

ALTER IGNORE TABLE yourTable
ADD UNIQUE INDEX idx_clicks (email, clicks);

【讨论】:

  • 这是我给出的答案的一个很好的替代方案。
【解决方案3】:

你可以使用聚合函数 sum() 和 group by。

SELECT email, sum(clicks) as sum FROM tableName group by email

【讨论】:

  • 这与 Tim Answer 有何不同?
  • 我在发布这个之后才看到另一个答案。
猜你喜欢
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2020-12-07
  • 2021-11-01
  • 2015-11-06
  • 2022-11-21
  • 2014-07-15
  • 1970-01-01
相关资源
最近更新 更多