0

所以我正在开发这个应用程序,我们有供应商,每个供应商都有很多分数,每个分数都有详细信息。输入供应商分数的方法有两种,一种是通过表格,另一种是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 号而不是 created_at 属性的原因是,如果我在字段中创建分数,rails 会为我提供 created_at 属性,excel 上传使用 sql 插入,因此无法获取该属性,因为id 是唯一的,我认为 ID 越大,记录越新

4

2 回答 2

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;"

演示

于 2013-04-10T18:48:38.063 回答
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
)
于 2013-04-10T18:30:21.567 回答