两个表上的mysql查询没有得到重复

问题描述:

我有两个表,名称,电子邮件。一个来自订单,一个来自通讯注册。两个表上的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 

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

,你可以:

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 

正如其他人所说,你可以按电子邮件。问题是,电子邮件只会返回1行,因此您需要决定使用哪一个名称与该行一起返回。

您在您的问题中指出,注册时可能没有名称或简写形式,所以我会假设您想从订单表中获取名称。因此,我要做的是从订单中选择电子邮件和姓名,然后将其与来自注册表中的电子邮件和姓名联合起来,其中电子邮件不存在于订单表中(这可以让您获得剩下的内容)。它看起来是这样的:

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

这是一个SQL Fiddle它。

编辑

这是假定电子邮件是独一无二的,我希望它是。