2016-01-23 113 views
1

问题我有一组查询,我试图运行,但我有问题让他们一起运行。SQL加入&排除查询

我的设立是在括号列名如下:

  • 表1(电子邮件/日期)
  • 表2(电子邮件/ Date_Submitted)

我已经写3查询哪些工作完美,彼此独立,但我似乎无法弄清楚如何连接它们。

查询1 - 从表1(rfi_log)

SELECT DISTINCT email, date_submitted 
FROM rfi_log 
WHERE date_submitted BETWEEN '[start_date]' AND '[end_date]' 

查询2个不同的电子邮件 - 从表2鲜明电子邮件(masterstudies)

SELECT DISTINCT email 
FROM orutrimdb.mastersstudies 
WHERE date BETWEEN '[start_date]' AND '[end_date]' 

查询3 - 加入查询,查找表1中的重复电子邮件&表2

SELECT rfi_log.email as emails, orutrimdb.mastersstudies.email 
FROM rfi_log 
    CROSS JOIN orutrimdb.mastersstudies 
    ON orutrimdb.mastersstudies.email=rfi_log.email 
    WHERE date_submitted BETWEEN '[start_date]' AND '[end_date]'; 

我现在的问题是,我需要通过某种方式对这些查询结合起来,这样我可以在日期范围内获得两个表中的DISTINCT电子邮件的数量,同时不包括查询识别的电子邮件3.

我需要:

  • 查询3 = COUNT DISTINCT电子邮件的电子邮件鲜明(在查询3未识别)
  • 查询2 =计数
  • 查询1个不同的电子邮件(在查询3中未标识)

的=计数最终我需要是在日期范围内以获得不同的电子邮件的总计数“的无重复”,因为有位于重复两个表。

这是如何实现的?

+0

我不知道你可以将所有三个查询都放到一个查询中,但是你可以通过使用[NOT IN](http://stackoverflow.com/a/1001197/870729)排除查询3中的查询,条款。 **作为一个澄清**你提到你得到的“计数”,但实际上你得到的所有电子邮件。如果你只是想要计数,为什么不选择'SELECT COUNT(distinct email)FROM ...' –

+0

最后 - 确定你确实需要/想要使用'CROSS JOIN' - 它返回比通常需要的更大的结果,并且很可能被替换为'INNER JOIN'。 –

+0

你可以做一个['UNION'](http:///dev.mysql.com/doc/refman/5.7/en/union.html)query - 'SELECT rfi_log.email as emails,orutrimdb.mastersstudies.email FROM rfi_log CROSS JOIN orutrimdb.mastersstudies ... UNION SELECT DISTINCT NULL,email FROM orutrimdb.mastersstudies ... UNION SELECT DISTINCT email,NULL FROM rfi_log ...' – Sean

回答

0

这样做的一种方法是带聚合的union all。下面获取有关每个电子邮件重复信息:

select email, sum(isrfi) as numrfi, sum(isms) as numms 
from ((select email, 1 as isrfi, 0 as isms 
     from rfilog 
    ) union all 
     (select email, 0, 1 
     from orutrimdb.mastersstudies 
    ) 
    ) e 
group by email; 

之上的聚集为您提供您正在寻找的信息:

select numrfi, numms, count(*), min(email), max(email) 
from (select email, sum(isrfi) as numrfi, sum(isms) as numms 
     from ((select email, 1 as isrfi, 0 as isms 
      from rfilog 
      ) union all 
      (select email, 0, 1 
      from orutrimdb.mastersstudies 
      ) 
      ) e 
     group by email 
    ) e 
group by numrfi, numms; 

注意,这也发现在一个表中重复。