如何删除 MySQL 中的重复加入 table 记录?
How can I delete duplicate join table records in MySQL?
假设我有 table 个 news_stories,并且这些故事中的每一个都可以通过 related_stories table.
相互关联
related_stories 的架构是这样的:
related_stories
----------------
id: INT
story_id: INT
related_id: INT
一开始,没有人添加验证来防止 2 个故事之间的多重关系,所以有时你会得到 2 related_stories 条记录,如下所示:
id: 1, story_id: 3, related_id: 4
和
id: 2, story_id: 4, related_id: 3
本质上,这是重复。
我现在可以添加一个验证来防止这种情况发生,但这并没有改变我仍然有数千条重复记录(或创建相同关系的记录)的事实。
我需要一些方法来清除这些旧的重复项,每个关系只留下一条记录。如果它全部基于单个字段,这将非常简单,但由于 ID 可以在任何一个字段中,这对我来说似乎很棘手。
如何删除 MySQL 中这些记录的重复项?出于某种原因,它只是没有发生在我身上。 Rails 的解决方案也将受到欢迎,尽管我更喜欢普通的 MySQL.
hash = {}
all_stories = RelatedStories.all.map{|rs| hash[rs.id] = [rs.story_id, rs.related_id].sort}
hash.select{|_id, data| hash.has_value?(data)}
删除最大、最小组合(保留1,2,去掉2,1):
delete rel from rel join (
select greatest(id1,id2) id1, least(id1,id2) id2
from rel
group by least(id1,id2), greatest(id1,id2)
having count(*) > 1
) d on rel.id1 = d.id1 and rel.id2 = d.id2;
您还可以修改以根据 min/max id 保留一行。
假设我有 table 个 news_stories,并且这些故事中的每一个都可以通过 related_stories table.
相互关联related_stories 的架构是这样的:
related_stories
----------------
id: INT
story_id: INT
related_id: INT
一开始,没有人添加验证来防止 2 个故事之间的多重关系,所以有时你会得到 2 related_stories 条记录,如下所示:
id: 1, story_id: 3, related_id: 4
和
id: 2, story_id: 4, related_id: 3
本质上,这是重复。
我现在可以添加一个验证来防止这种情况发生,但这并没有改变我仍然有数千条重复记录(或创建相同关系的记录)的事实。
我需要一些方法来清除这些旧的重复项,每个关系只留下一条记录。如果它全部基于单个字段,这将非常简单,但由于 ID 可以在任何一个字段中,这对我来说似乎很棘手。
如何删除 MySQL 中这些记录的重复项?出于某种原因,它只是没有发生在我身上。 Rails 的解决方案也将受到欢迎,尽管我更喜欢普通的 MySQL.
hash = {}
all_stories = RelatedStories.all.map{|rs| hash[rs.id] = [rs.story_id, rs.related_id].sort}
hash.select{|_id, data| hash.has_value?(data)}
删除最大、最小组合(保留1,2,去掉2,1):
delete rel from rel join (
select greatest(id1,id2) id1, least(id1,id2) id2
from rel
group by least(id1,id2), greatest(id1,id2)
having count(*) > 1
) d on rel.id1 = d.id1 and rel.id2 = d.id2;
您还可以修改以根据 min/max id 保留一行。