我有数百万行的Message.rb
我正在进行迁移:
add_index :messages, [:mm_id, :c_id, :s_id], unique: true, name: :mm_unique
但是迁移失败了,因为它找到了重复的行。我不在乎s_id的值是什么(只要它是一个整数)并且s_id和mm_id只需要在c_id范围内是唯一的
所以我需要做的是找到mm_id IS NOT NULL且mm_id,s_id和c_id有重复行的所有消息。
然后,我如何编写查询来快速解决这个问题?我想在s_id上设置一个随机值,只要它是一个整数,因为我不关心这个值是什么。
答案 0 :(得分:0)
您的查询应该是查找重复的行:
Message.joins("INNER JOIN
( SELECT mm_id, s_id, c_id, COUNT(*) total_count
FROM messages GROUP BY mm_id, s_id, and c_id
HAVING COUNT(*) >= 2
) b ON messages.mm_id = b.mm_id AND
messages.s_id = b.s_id AND messages.c_id = b.c_id"
)
.where("messages.mm_id IS NOT NULL")
.select("messages.*, b.total_count AS duplicate")