2016-01-23 132 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; 

注意,這也發現在一個表中重複。