2014-04-21 46 views
0

我有三個不同的表格 - 訂閱者,取消訂閱者,批量訂閱者。Mysql查詢不存在

我想從羣發訂戶表中打印出每封電子郵件。但是,只有在訂戶和非訂戶表中都不存在該電子郵件才能打印。

我知道如何做到這一點與數組,但是我想要一個普通的mysql查詢。

mysql查詢會是什麼?

謝謝!

+1

你認爲它應該是怎樣的?任何你已經嘗試過的? –

+0

你不需要更多的信息.​​.....有兩個表,它們都包含一個名爲(類似於)'email'的列,你需要來自T1的電子郵件,它不存在於T2的電子郵件中 – Martijn

回答

0

你可以做到這一點與子查詢(這是緩慢的,請閱讀下面的線!):

SELECT email 
FROM subscribers 
WHERE email NOT IN(SELECT email FROM unsubscribers) 

然而,這對於性能非常糟糕。我建議你改變你的數據庫的方式,只有一個表subscribers,並添加一列active(tinyint)。當有人退訂,你從1該值設置爲0之後,你可以停留在1個表:

SELECT email FROM subscribers WHERE active=1 

這是更快的,因爲一些原因:

  • 沒有子查詢
  • 的地方是不好的,因爲你要選擇數據的堆和比較字符串整數
  • 選擇在非常快(尤其是當你入索引)

除了速度更快之外,它對您的數據庫結構會更好。你不希望兩張桌子幾乎一樣,有電子郵件地址。這會產生重複的數據,並可能導致錯位

+0

對於剛剛編輯我的人帖子:我正在研究一些更多的信息。已完成部分編輯並在我的實現中實現:) – Martijn

0

您聽起來像一個沒有太多SQL經驗的人。你的頭銜確實指向了正確的方向。這裏是你如何把組件連接在一起:

select m.* 
from mass_subscribers m 
where not exists (select 1 from subscribers s where s.email = m.email) and 
     not exists (select 1 from unsubscribers u where u.email = m.email); 

NOT EXISTS恰好是這種類型的查詢非常不錯的選擇;它在MySQL和其他數據庫中通常非常高效。

0

沒有子查詢,使用連接

SELECT mass_subscribers.* 
FROM mass_subscribers ms 
LEFT JOIN subscribers s ON ms.email=s.email 
LEFT JOIN unsubscribers us ON us.email=s.email 
WHERE 
ms.email IS NULL 
AND 
us.email IS NULL