MySQL合并具有等效ID的行

时间:2016-08-26 05:50:03

标签: mysql

我遇到一个错误导致数据库表同时在ID列中混合了电子邮件和GUID的问题。

表格如下(简化):

GUID | Value | Date
cf@a |   21  | 2016
mf@b |   42  | 2015
mf@b |   21  | 2016
1aXd |   3   | 2016
a7vf |   9   | 2015

例如,用户cf @ a和用户1aXd是相同的。 GUID - 电子邮件组合存储在另一个表中。电子邮件是独一无二的。主键是ID(GUID)和日期组合。我的问题是,我如何更新表并合并行?两个合并行的Value列应该相加。

所以示例表假设(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 Workbench

1 个答案:

答案 0 :(得分: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

删除合并行:

DELETE t2 FROM t2
JOIN t1 USING (`GUID`)

<强>更新

如果只有一张桌子。

合并:

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。