Rails mysql删除重复的元组

时间:2013-04-10 18:12:54

标签: mysql sql ruby-on-rails duplicates

所以我正在开发这个应用程序,我们有供应商,每个供应商都有很多分数,每个分数都有详细信息。有两种方式为供应商输入分数,一种方式是通过表格,另一种是excel上传。现在我们有一些人通过电子表格上传,这将更新一个供应商,然后上传整个列表,为所有供应商创建重复。

我写了这个sql语句。注意:得分唯一的是1.它的ID和2. valid_from和valid_until日期的组合。

def remove_old_duplicates
  remove_dup = "DELETE s1 FROM `sms_development`.`scores` s1, `sms_development`.`scores` s2 WHERE s1.supplier_id = s2.supplier_id AND s1.valid_from = s2.valid_from AND s1.valid_until = s2.valid_until AND s1.id < s2.id;"

  ActiveRecord::Base.connection.execute remove_dup
end

基本上应该做的是获取表并将其与自身组合,然后查找供应商相同且valid_from和valid_until属性相同的所有分数。然后它会查找ID号最大的那个并删除其余的ID号。唯一的事就是不删除它们。我在工作台上运行查询,它说它的工作正常,而不是在应用程序中。我在导入新数据后运行此查询?关于可能导致这种情况的任何想法?

注意:我之所以基于ID编号而不是created_at属性的原因是因为rails给我创建了create_at属性,如果我在字段中创建得分,则excel上传使用sql插入,因此不会获得该属性,因为id是唯一的,我认为ID越大,记录越新

2 个答案:

答案 0 :(得分:2)

试试这个:

remove_dup = "DELETE s1 FROM `sms_development`.`scores` s1 JOIN
   `sms_development`.`scores` s2 ON s1.supplier_id = s2.supplier_id AND s1.valid_from = 
    s2.valid_from AND s1.valid_until = s2.valid_until AND s1.id < s2.id;"

<强> DEMO

答案 1 :(得分:1)

您的查询对我来说看起来不合适 - 您可以像这样重写您的查询:

DELETE FROM `sms_development`.`scores`
WHERE id NOT IN (
  SELECT MAX(id) FROM `sms_development`.`scores`
  GROUP BY supplier_id, valid_from, valid_until
)