2013-04-10 52 views
0

所以我正在開發這個應用程序,我們有供應商,每個供應商都有很多分數,每個分數都有詳細信息。有兩種方式爲供應商輸入分數,一種方式是通過表單,另一種方式是Excel上傳。現在我們有一些人通過電子表格上傳電子表格來更新單個供應商,然後上傳整個清單,爲所有供應商創建重複清單。Rails mysql刪除重複的元組

我寫了這個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號最大的那個,並刪除其餘的。唯一的事情是它不會刪除它們。我在工作臺上運行查詢,它說它的工作正常,但不在應用程序中。我剛剛導入新數據後運行此查詢?關於什麼可能導致這個問題的任何想法?

注意:我基於它的身份證號碼,而不是created_at屬性的原因是因爲rails給了我created_at屬性,如果我在字段中創建分數,Excel上載使用SQL插入,因此不會得到屬性,因爲ID是唯一我想通了的ID越大紀錄新

+0

你絕對相信,'DELETE S1 ...'是有效的SQL? – PinnyM 2013-04-10 18:26:53

+0

試試這個:'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 codeit 2013-04-10 18:36:46

+0

@PinnyM是的,它是有效的。 – codeit 2013-04-10 18:39:23

回答

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 
) 
+0

多數民衆贊成多性感,然後我:)謝謝 – TheLegend 2013-04-10 18:43:02

+0

當你有大數據時使用'IN'比較慢。所以最好使用'JOIN'。 – codeit 2013-04-10 18:52:18

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

+0

這也是一個非常好的答案。感謝您的幫助 – TheLegend 2013-04-10 19:04:34

+0

感謝您的幫助!你是一個搖滾明星。也爲演示+1,我不知道他們有一個SQL小提琴。 – TheLegend 2013-04-10 19:09:26