2014-01-21 15 views
0

我試圖從我們的所有數據庫表中爲我正在Web服務器上運行的腳本獲取電子郵件。不幸的是,在一些表格中有一些重複的電子郵件。這應該是一個簡單的解決方案,使用SELECT DISTINCT,INSERT IGNORE等,但似乎沒有任何工作。MySQL - 唯一且不同的值不起作用

這是我當前的查詢:

CREATE TEMPORARY TABLE `all_emails` (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    email VARCHAR(80) NOT NULL, 
    ip_address VARCHAR(20) NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE INDEX(email) 
); 

INSERT IGNORE INTO `all_emails` (email, ip_address) 
SELECT email,IP_address 
    FROM `table_1_emails` 
WHERE unsubscribed_at IS NULL; 

INSERT IGNORE INTO `all_emails` (email, ip_address) 
SELECT email,ip_address 
    FROM `table_2_emails` 
WHERE unsubscribed_at IS NULL; 

INSERT IGNORE INTO all_emails (email, ip_address) 
SELECT email,ip_address 
    FROM `table_3_emails`; 

INSERT IGNORE INTO `all_emails` (email, ip_address) 
SELECT email,ip_address 
    FROM `table_4_emails`; 

SELECT DISTINCT email, ip_address, id FROM `all_emails`; 

這仍然產生重複的電子郵件。

+0

對於'INSERT IGNORE'爲你準備的工作,你首先需要的是防止重複一個獨特的密鑰。 –

+0

在'email,ip_address,id'上創建一個唯一索引。 –

+0

@GordonLinoff,爲了防止重複的內容,可能是一個唯一的索引只是'email'和'ip_address'? –

回答

0

只需使用UNION刪除單一INSERT重複的:

INSERT IGNORE INTO `all_emails` (email, ip_address) 
SELECT email,IP_address 
    FROM `table_1_emails` 
WHERE unsubscribed_at IS NULL 
UNION 
SELECT email,ip_address 
    FROM `table_2_emails` 
WHERE unsubscribed_at IS NULL 
UNION 
SELECT email,ip_address 
    FROM `table_3_emails` 
UNION 
SELECT email,ip_address 
    FROM `table_4_emails`; 
+0

獲得與我的SQL查詢相同的結果。 – jperezov

+0

@ user3191820然後,您需要修剪尾部/前導空格的列。所有的表都使用相同的字符集嗎? – Kermit

+0

我現在在SELECT語句中使用TRIM(email)。我也檢查了桌子 - 他們都使用UTF8。一個TINYTEXT而不是VARCHAR(80),所以我將它切換到VARCHAR(80)。但仍然沒有運氣。 – jperezov