如何删除 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 保留一行。