两个表上的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可能有助于理解这个查询:
答
,你可以:
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它。
编辑
这是假定电子邮件是独一无二的,我希望它是。
这三个答案都可以工作,但这是样本数据中最快的。请参阅问题中的提示 – 2014-11-05 05:30:28