在两个表上进行mysql查询而不获取重复项
我有两张桌子,名字是email。一个来自订单,一个来自通讯注册 订单表中的所有条目都有名称和电子邮件,但有些时事通讯注册没有名称或缩写 如果我使用电子邮件进行联合,我会在名称不匹配的条目上收到重复的电子邮件在两个表上进行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 如何在没有电子邮件副本的情
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));
这里有一个例子
编辑
这假设电子邮件是唯一的,我希望它是唯一的。这三个答案都有效,但在样本数据中这是最快的。见问题注释