如何在数百万行上运行此复杂查询

时间:2015-06-01 01:46:23

标签: 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 IS NOT NULL且mm_id,s_id和c_id有重复行的所有消息。

然后,我如何编写查询来快速解决这个问题?我想在s_id上设置一个随机值,只要它是一个整数,因为我不关心这个值是什么。

1 个答案:

答案 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")