我有两个名字的桌子,电子邮件。一个来自订单,一个来自简报注册。
订单表中的所有条目都有名称和电子邮件,但有些简报注册没有名称或简短形式。
如果我使用电子邮件联盟,名称我会在名称不匹配的条目上收到电子邮件副本。
SELECT email, name FROM orders
UNION
SELECT email, name FROM signups
实施例
andrew@xxx.com Andrew
billy@zzz.com Billy
billy@zzz.com 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
答案 0 :(得分:2)
只需按email
分组。这应该给你留下不同的email
s。对于每个email
,第一个name
取自该组。由于我们首先对联合进行了排序,因此我们始终会从name
获得orders
。
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 :(得分: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 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
答案 2 :(得分:0)
正如其他人所说,您可以通过电子邮件进行分组。问题是,电子邮件只返回1行,因此您需要决定使用哪一个名称返回该行。
您在问题中说明注册中的人可能没有姓名或简短表格,所以我假设你想从订单表中获取名称。所以我要做的是从订单中选择电子邮件和名称,并将其与电子邮件和名称表中的名称结合起来,订单表中不存在电子邮件(这样可以让您了解剩下的内容) 。它看起来像这样:
(SELECT email, name FROM orders)
UNION
(SELECT email, name FROM signups WHERE email NOT IN (SELECT email FROM orders));
以下是SQL Fiddle。
修改强>
这假设电子邮件是唯一的,我希望它是。