2014-11-05 62 views
2

我有兩個表,名稱,電子郵件。一個來自訂單,一個來自通訊註冊。兩個表上的mysql查詢沒有得到重複

訂單表中的所有條目都有名稱和電子郵件,但某些時事通訊註冊沒有名稱或簡寫形式。

如果我通過電子郵件與工會打交道,則姓名會與名稱不匹配的條目重複。

SELECT email, name FROM orders 
UNION 
SELECT email, name FROM signups 

[email protected] Andrew 
[email protected] Billy 
[email protected] B 

我如何可以檢索電子郵件,姓名沒有電子郵件副本?

注意

所有這三個給出答案的工作,但wolfgangwalter的是最快的樣本數據

2243 clients 
11402 signups 
1057 overlap (clients in signups) 

返回

12588 posts 320 ms - wolfgangwalter 
12588 posts 360 ms - Jaugar Chang 
12588 posts 23.5 sec! - McAdam331 

回答

2

Just group by email。這應該給你不同的email s。每email第一name取自該組。由於我們先將工會分類,我們將始終從orders獲得name

SELECT * 
FROM (SELECT * 
     FROM (SELECT email, name, 1 AS SortKey FROM orders 
      UNION ALL 
      SELECT email, name, 2 AS SortKey FROM signups 
      ) AS list 
     ORDER BY SortKey 
    ) AS ordered_list 
GROUP BY email 

這裏有一些更ressources可能有助於理解這個查詢:

+0

這三個答案都可以工作,但這是樣本數據中最快的。請參閱問題中的提示 – 2014-11-05 05:30:28

0

,你可以:

SELECT 
    email, 
    MAX(name), --Get the max name from two tables 
    MAX(case source when 'o' then name else null end), --Get the max name from orders table only 
    GROUP_CONCAT(name) --will get "Billy, B" for [email protected] 
FROM 
(
SELECT email, name, 'o' as source FROM orders 
UNION 
SELECT email, name, 's' as source FROM signups 
) AS TMP 
GROUP BY email 
0

正如其他人所說,你可以按電子郵件。問題是,電子郵件只會返回1行,因此您需要決定使用哪一個名稱與該行一起返回。

您在您的問題中指出,註冊時可能沒有名稱或簡寫形式,所以我會假設您想從訂單表中獲取名稱。因此,我要做的是從訂單中選擇電子郵件和姓名,然後將其與來自注冊表中的電子郵件和姓名聯合起來,其中電子郵件不存在於訂單表中(這可以讓您獲得剩下的內容)。它看起來是這樣的:

(SELECT email, name FROM orders) 
UNION 
(SELECT email, name FROM signups WHERE email NOT IN (SELECT email FROM orders)); 

這是一個SQL Fiddle它。

編輯

這是假定電子郵件是獨一無二的,我希望它是。