在两个表上进行mysql查询而不获取重复项

在两个表上进行mysql查询而不获取重复项,mysql,Mysql,我有两张桌子,名字是email。一个来自订单,一个来自通讯注册 订单表中的所有条目都有名称和电子邮件,但有些时事通讯注册没有名称或缩写 如果我使用电子邮件进行联合,我会在名称不匹配的条目上收到重复的电子邮件 SELECT email, name FROM orders UNION SELECT email, name FROM signups 范例 andrew@xxx.com Andrew billy@zzz.com Billy billy@zzz.com B 如何在没有电子邮件副本的情

我有两张桌子,名字是email。一个来自订单,一个来自通讯注册

订单表中的所有条目都有名称和电子邮件,但有些时事通讯注册没有名称或缩写

如果我使用电子邮件进行联合,我会在名称不匹配的条目上收到重复的电子邮件

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

andrew@xxx.com  Andrew
billy@zzz.com Billy
billy@zzz.com B
如何在没有电子邮件副本的情况下检索电子邮件和姓名

注意

所有三个答案都有效,但沃尔夫甘沃尔特的答案在样本数据上最快

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
你可以:

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 billy@zzz.com
FROM
(
SELECT email, name, 'o' as source FROM orders
UNION
SELECT email, name, 's' as source FROM signups
) AS TMP
GROUP BY email

只需通过
电子邮件进行分组
。这将给您留下不同的
电子邮件。对于每封
电子邮件
,第一封
姓名
都来自该组。由于我们首先对联合进行排序,因此我们将始终从
订单
中获取
名称

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
以下是有助于理解此查询的更多资源:


正如其他人所说,您可以通过电子邮件进行分组。问题是,电子邮件只返回1行,因此您需要决定使用哪一行返回名称

您在问题中指出,注册中的人可能没有姓名,或者没有简短的表单,因此我假设您希望从orders表中获取姓名。因此,我要做的是从订单中选择电子邮件和名称,并将其与“注册”表中的电子邮件和名称合并,而“订单”表中不存在该电子邮件(这允许您获取剩余内容)。它看起来是这样的:

(SELECT email, name FROM orders)
UNION
(SELECT email, name FROM signups WHERE email NOT IN (SELECT email FROM orders));
这里有一个例子

编辑


这假设电子邮件是唯一的,我希望它是唯一的。

这三个答案都有效,但在样本数据中这是最快的。见问题注释