Mysql 如何在数百万行上运行此复杂查询
我有数百万行Message.rb 我正在尝试运行一个迁移:Mysql 如何在数百万行上运行此复杂查询,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,我有数百万行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不为NULL,并且mm_id、s_id和c_id有重复的行 那么,如何编写查询以快速修复此问题?我想
add_index :messages, [:mm_id, :c_id, :s_id], unique: true, name: :mm_unique
但是,迁移失败,因为它正在查找重复的行。我不在乎s_id的值是什么(只要它是一个整数),s_id和mm_id只需要在c_id的范围内是唯一的
所以我需要做的是找到所有消息,其中mm_id不为NULL,并且mm_id、s_id和c_id有重复的行
那么,如何编写查询以快速修复此问题?我想在s_id上设置一个随机值,只要它是一个整数,因为我不关心该值是什么。您的查询应该是查找重复的行:
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")