2013-11-14 12 views
6

Ho una tabella del tipo:Eliminare le righe duplicate e aggiungere i valori righe eliminate a uno che rimanga

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

voglio cancellare da questa tabella righe duplicate (secondo il nome) ma prima di fare la cancellazione add il valore delle righe eliminate al rimangono fila

quindi in questo caso voglio che il tavolo dopo la query esecuzione assomigliare:

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

E 'possibile farlo in mysql, senza creare un'altra tabella e copiare i dati, perché questo è un grande tavolo (1 milione di righe ma aumenta ogni giorno)?

+0

Quanto è grande 'molto grande' ? Ha bisogno di succedere in una transazione? È un sistema live? – Vatev

+0

Hai davvero lo stesso ID = 1? – valex

+0

Non hai alcuna chiave primaria sul tavolo? –

risposta

1

SQLFiddle demo

filari primo aggiornamento con min(id) per ogni 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; 

e quindi eliminare le righe ad eccezione solo le righe con min(id) per ogni 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

Questo è come creare un'altra tabella. L'unica differenza è che sarà un tavolo temporaneo invisibile. È anche più lento perché lo stai facendo due volte. – Vatev

Problemi correlati