合并然后删除重复的条目

时间:2009-10-16 10:46:36

标签: mysql

我的mySQL数据库有一些重复的条目。他们有相同的领域 - 电话。但他们也有不同的领域。例如,我有两个带有相同电话的条目,但第一个条目的评级字段= default_value,第二个条目的评级字段= 5。 所以我必须合并这些条目,然后才删除重复...

更常见的例子:

    entry1.phone==123
entry1.phone==etry2.phone
    entry1.rating!=entry2.phone
    entry1.rating==default_value(0)
    entry2.rating==5
    merge
    entry1.phone==123
    entry1.rating==5
    entry2 is deleted

2 个答案:

答案 0 :(得分:2)

我认为你不能有效地在SQL中做到这一点。一个缓慢的方法就是:

CREATE TEMPORARY TABLE tmp_table (...);
INSERT INTO tmp_table SELECT phone, max(rating) FROM table GROUP BY phone;
TRUNCATE table;
INSERT INTO table SELECT * FROM tmp_table;

更好的方法是存储过程或外部脚本。从phone排序的表中选择所有行,并手动进行分组/合并/删除(迭代结果,与上一行的phone值进行比较,如果不同则有新组等)。在MySQL中编写存储过程很痛苦,所以我不打算为你编写代码。 :)

答案 1 :(得分:1)

如果您只是尝试使用非默认评级更新第一条记录,那么您似乎并不需要合并任何记录。我想你可以删除任何默认评级的记录。

Select a.*
from tbl a
inner join tbl b
on a.Phone = b.Phone
    and a.Rating < b.Rating


Delete a
from tbl a
inner join tbl b
on a.Phone = b.Phone
    and a.Rating < b.Rating

如果您确实需要更新第一条记录并删除第二条记录,那么如果您有自动增量ID,则可以执行类似操作。下一个示例是如果存在ID,我将如何更新第一条记录。如果您只有一次重复的电话号码,这只是可靠的。

Update a
Set a.Rating = b.Rating
from tbl a
inner join tbl b
on a.Phone = b.Phone
    and a.Rating < b.Rating
    and a.ID < b.ID


Delete a
from tbl a
inner join tbl b
on a.Phone = b.Phone
    and a.Rating = b.Rating
    and b.ID > a.ID

希望这有帮助。

-Ranthalion