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

时间:2014-11-05 01:08:40

标签: mysql

我有两个名字的桌子,电子邮件。一个来自订单,一个来自简报注册。

订单表中的所有条目都有名称和电子邮件,但有些简报注册没有名称或简短形式。

如果我使用电子邮件联盟,名称我会在名称不匹配的条目上收到电子邮件副本。

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

3 个答案:

答案 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

修改

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