2013-11-14 18 views
6

Tôi có một bảng như:Xóa hàng trùng lặp và thêm giá trị hàng xóa một mà vẫn

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

Tôi muốn xóa từ bảng này hàng trùng lặp (theo tên) nhưng trước khi làm các add xóa giá trị của các hàng xóa đến duy trì hàng

như vậy trong trường hợp này tôi muốn rằng bảng sau khi truy vấn chạy giống như sau:

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

có thể làm điều đó trong mysql, mà không cần tạo một bảng khác và sao chép dữ liệu, bởi vì đây là một bảng lớn (1 triệu hàng nhưng tăng mỗi ngày)?

+0

lớn như thế nào là 'rất lớn' ? Nó có cần phải xảy ra trong một giao dịch không? Nó là một hệ thống sống? – Vatev

+0

Bạn có thực sự có cùng ID = 1 không? – valex

+0

bạn không có bất kỳ khóa chính nào trên bàn? –

Trả lời

1

SQLFiddle demo

hàng cập nhật đầu tiên với min(id) cho mỗi NAME

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; 

Và sau đó xóa hàng ngoại trừ chỉ có những hàng với min(id) cho mỗi NAME

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 
+0

Điều này cũng giống như việc tạo một bảng khác. Sự khác biệt duy nhất là nó sẽ là một bảng tạm thời vô hình. Nó cũng chậm hơn bởi vì bạn đang làm nó hai lần. – Vatev

Các vấn đề liên quan