删除重复行并将被删除行的值添加到保留行中

6

我有一个类似于这样的表格:

id      |    name    |  profit |  cost  
---------------------------------------
1       |  aaa       | 4       | 2 
2       |  aaa       | 4       | 3 
3       |  aaa       | 4       | 2 
4       |  bbb       | 4       | 1 

我希望从这个表中删除重复的行(根据名称),但在执行删除之前,将已删除行的值添加到保留行中。

因此,在这种情况下,我希望运行查询后的表格如下:

id      |    name    |  profit |  cost  
---------------------------------------
1       |  aaa       | 12      | 7 
4       |  bbb       | 4       | 1 

是否可以在MySQL中完成此操作,而无需创建另一个表并复制数据,因为这是一张大表(有100万行但每天都在增加)?


“非常大”有多大?需要在一个事务中完成吗?这是一个实时系统吗? - Vatev
你确定你的ID是1吗? - valex
你的表上没有主键吗? - John Woo
抱歉关于ID的问题,我会修复它,这是主键。 - Haim Evgi
最终结果必须是记录集中最低的ID吗?还是可以是一个新记录(例如 5 | aaa | 12 | 7)? - AgRizzo
可以创建新记录。 - Haim Evgi
1个回答

1

SQLFiddle演示

首先更新每个NAMEmin(id)行。

UPDATE T a JOIN 
(
  SELECT min(ID) as minID,name,SUM(profit) as SP,SUM(cost) as SC 
  FROM T GROUP BY name
) b 
 ON a.id = b.minID 
 SET a.profit = b.sp,a.cost=b.sc;

然后删除除每个 NAMEmin(id) 行之外的所有行。

DELETE T
FROM T
LEFT JOIN 
(
  SELECT min(ID) minid ,name FROM T GROUP BY name
) b  
ON t.id = b.minid
WHERE b.minid is NULL

这与创建另一个表相同。唯一的区别是它将是一个不可见的临时表。由于您要执行两次操作,因此速度较慢。 - Vatev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接