2016-08-26 3 views
2

실수로 인해 ID 열에 전자 메일과 GUID가 섞여있는 데이터베이스 테이블이 생성되는 문제가 있습니다.MySQL이 동일한 ID로 행을 병합

테이블이 간체 같다 :

GUID | Value | Date 
[email protected] | 21 | 2016 
[email protected] | 42 | 2015 
[email protected] | 21 | 2016 
1aXd | 3 | 2016 
a7vf | 9 | 2015 

예컨대 사용자의 CF @ A와 사용자 1aXd 대해 동일

곳. GUID - 전자 메일 조합은 다른 테이블에 저장됩니다. 이메일은 고유합니다. 기본 키는 ID (GUID)와 날짜를 결합한 것입니다. 내 문제는 어떻게 테이블을 업데이트하고 행을 병합합니까? 두 개의 병합 행의 값 열을 합산해야합니다. 그래서 예를 들어 테이블이 가정

(CF @ A -> 1aXd 및 MF @ B -> 8bga 및 UI @ q를 -> a7vf)이 될 것입니다 :

GUID | Value | Date 
1aXd | 24 | 2016 <-- merged, Value = 21+3 
8bga | 42 | 2015 <-- converted to GUID 
8bga | 21 | 2016 <-- converted to GUID 
         <-- one row removed (merged with the first one) 
a7vf | 9 | 2015 <-- untouched 

어떤 도움 주셔서 감사합니다!

나는 C#에서이 작업을 수행 할 수 있습니다하지만 난 오히려 MySQL의 워크 벤치

답변

1

사용 JOIN 함께 할 방법을 배울 것입니다 : 당신이 업데이트 값을 원하는 경우에

SELECT t1.Value + t2.Value 
FROM t1 
JOIN t2 USING (`GUID`) 

, 당신은 이런 식으로 뭔가가 필요 :

UPDATE t1 
JOIN t2 USING (`GUID`) 
SET t1.Value = t1.Value + t2.Value 

제거 병합 된 행 :

,210

UPDATE

하나의 테이블이있는 경우.

병합 : 삭제

UPDATE t1 
JOIN (
    SELECT GUID, SUM(Value) as amount, COUNT(1) as cnt 
    FROM t1 
    GROUP BY `GUID` 
    HAVING cnt > 1 
) t2 ON t2.GUID = t1.GUID 
SET t1.Value = t2.amount; 

:

CREATE table t2 (
    GUID integer, 
    Value integer, 
    Date integer 
); 

INSERT INTO t2 (GUID, Value, Date) 
SELECT GUID, Value, MAX(Date) FROM t1 GUID, Value; 

결과가 T2에있을 것입니다.

+0

하지만 행이 삭제되지 않습니까? – maxx

+0

@maxx 병합 된 행을 제거하는 예제를 사용하여 답변을 업데이트했습니다. – mnv

+0

병합 된 행을 모두 제거하지는 않겠습니까? 나는 하나의 테이블 t1을 가지고 있는데 그 안에는 행을 병합하고 싶습니다. – maxx

관련 문제