2011-05-09 71 views
4

我有一個列表ID,firstname,lastname,address,email等。從MYSQL表中刪除重複的電子郵件地址

有沒有什麼辦法從TABLE中刪除重複的email地址?

(從評論)其他信息:

如果有兩行具有相同email地址一個將有一個正常的firstnamelastname但對方必須在firstname「即時」。所以我可以區分它們。我只想刪除名爲'instant'的人。

請注意,firstname='Instant'將只有1 email地址的一些記錄。我不想只刪除一個唯一的電子郵件地址,所以我不能刪除firstname='Instant'中的所有內容。

請幫我一把。

+0

您打算如何處理該行的其餘部分?如果你有兩個名字相同的電子郵件地址,你會怎麼做?你是否刪除了*重複的電子郵件,或只有一個?你如何決定哪個? – forsvarir 2011-05-09 11:01:30

+0

如果有兩個相同的電子郵件地址,則可以使用正常的名字和姓氏,但其他名字在名字中會有「即時」。所以我可以區分它們。我只想刪除名爲「instant」的那個。 – fawad 2011-05-09 11:03:13

+0

爲什麼不直接刪除firstname ='Instant''? – forsvarir 2011-05-09 11:08:56

回答

0

我不知道這是否可以在MYSQL中使用(我還沒有使用過)......但是您應該可以執行類似以下代碼片斷的操作。

我建議你運行它們以便了解是否正確選擇了正確的數據。如果它確實有效,那麼你可能想在列上創建一個約束。

獲取所有的重複的電子郵件地址:

SELECT 
    EMAILADDRESS, COUNT(1) 
FROM 
    TABLE 
GROUP BY EMAILADDRESS 
HAVING COUNT(1) > 1 

然後確定ID從給出:

SELECT 
    ID 
FROM 
    TABLE 
WHERE 
    EMAILADDRESS IN (
     SELECT 
      EMAILADDRESS 
     FROM 
      TABLE 
     GROUP BY EMAILADDRESS 
     HAVING COUNT(1) > 1 
    ) 

於是最後,刪除行,並基於上述及其他限制:

DELETE 
FROM 
    TABLE 
WHERE 
    ID IN (
     SELECT 
      ID 
     FROM 
      TABLE 
     WHERE 
      EMAILADDRESS IN (
       SELECT 
        EMAILADDRESS 
       FROM 
        TABLE 
       GROUP BY EMAILADDRESS 
       HAVING COUNT(1) > 1 
      ) 
    ) 
    AND FIRSTNAME = 'Instant' 
+0

謝謝,我希望這會幫助我。最好 ! – fawad 2011-05-09 11:30:50

+0

太棒了,它爲我工作。 – fawad 2011-05-09 11:46:57

+4

**當心**,如果您沒有OP的「即時」標誌,這實際上會刪除原件。如果您沒有其他方式來確定哪個「重複」記錄,這不會幫助您進行重複數據刪除。 – 2015-10-29 19:47:25

0
  • 複製表結構
  • 將唯一的密鑰對新表(只是爲了安全)
  • 的電子郵件由電子郵件地址,請在從舊的一個分組中的新表中選擇數據的INSERT
+0

如果你不介意告訴我在mysql中執行所有這3個步驟的步驟。我只是初學者。 – fawad 2011-05-09 10:58:43

+0

您不能僅通過電子郵件地址進行分組。 'select'子句中的所有內容都必須位於'group by'子句中。如果說'地址'(表格中的另一列)有一個額外的空間,這是如何工作的?你仍然有兩行,但第二個將失敗插入(我期望在同一語句中的任何其他插入)。這可能會做OP的要求(如果正確實施),但它似乎是一個不好的解決方案... – forsvarir 2011-05-09 11:07:20

+0

你是對的。這是不好的編程習慣,我允許重複的電子郵件地址發出命令。現在我感覺他們遇到了問題。 – fawad 2011-05-09 11:10:22

2

雖然MiPnamic的回答基本上是正確的,但它並不能解決您保留哪些記錄以及丟棄哪些記錄(以及如何分類相關記錄)的問題。簡單的答案是,這不能通過編程來完成。

給定一個這樣的查詢:

SELECT email, MAX(ID), MAX(firstname), MAX(lastname), MAX(address) 
FROM customers 

使事情變得更糟 - 因爲你可能選擇從重複的行字段的混合物。您需要執行以下操作:

SELECT csr2.* 
FROM customers csr2 
WHERE ID IN (
    SELECT MAX(id) 
    FROM customers csr 
    GROUP BY email 
); 

獲取一組唯一的現有行。當然,你仍然需要整理所有的記錄(提示 - 這就是上述查詢沒有返回的IDs ni客戶表)。

+0

你是對的,我不在乎我保留的記錄 – MiPnamic 2011-05-09 12:04:58

4
DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY email) 

這爲每個電子郵件保留最低的,第一個插入的ID。

+0

這很適合我的情況。 – 2015-10-29 19:57:41

6
DELETE n1 FROM customers n1, customers n2 WHERE n1.ID > n2.ID AND n1.email = n2.email 
+0

非常好的解決方案,像魅力一樣工作! – AlanRezende 2017-06-15 17:34:23

相關問題