2011-09-22 50 views
0

我正在將三張桌子連接在一起,但在其中一張桌子上沒有任何信息,除非用戶打開我們發送給他們的電子郵件如果數據不在其中之一,則加入三張表

我目前使用這個SQL,但它似乎不能正常工作

SELECT email.senton, customer.*, count(tracker.viewed) as viewed 
FROM email_sent AS email, customer_detail AS customer, email_tracker AS tracker 
WHERE email.customer_id = customer.customer_id 
    AND customer.Email = tracker.emailaddress 
    AND customer.LeadOwnerId = '{$this->userid}' 

這是由於表email_tracker可能沒有在它的客戶信息,除非客戶已經打開該電子郵件

+0

就像一個建議:格式化查詢,以便它更容易閱讀,並使其他人更容易幫助你:) – Sondre

回答

1

嘗試這個:

SELECT email.senton, customer.*, COUNT(tracker.viewed) as viewed 
FROM email_sent email INNER JOIN customer_detail customer 
    ON email.customer_id = customer.customer_id 
LEFT JOIN email_tracker tracker 
    ON customer.Email = tracker.emailaddress 
WHERE customer.LeadOwnerId = '{$this->userid}' 

LEFT JOIN子句中使用,如果他們在加入存在總是在右側部分上左部和列列...

根據您的評論編輯:
嘗試改變COUNT(tracker.viewed)部分與

CASE 
    WHEN tracker.emailaddress IS NOT NULL THEN COUNT(tracker.viewed) 
    ELSE 0 
END 
    as viewed 

我不知道它的工作原理,我不能測試,但給它一個嘗試

+0

這樣的工作,但計數(tracker.viewed)似乎停止左連接工作。有沒有其他辦法做計數部分 – RussellHarrower

+0

@RussellHarrower:檢查我的編輯帖子 – Marco

+0

@RussellHarrower:它的工作? – Marco

1

您需要的行爲是LEFT OUTER JOIN(也稱爲LEFT JOIN)。如果該行在另一個表中不存在,則它將該值設置爲NULL

SELECT email.senton, customer.*, COUNT(tracker.viewed) AS viewed 
FROM email_sent AS email 
    JOIN customer_detail AS customer USING(customer_id) 
    LEFT OUTER JOIN email_tracker AS tracker ON customer.Email = tracker.emailaddress 
WHERE customer.LeadOwnerId = '{$this->userid}' 

PS:它一般是一個更好的主意,用JOIN s,而不是一個笛卡爾乘積(你,做了什麼)。

+0

+1用於提示使用'JOIN'而不是笛卡爾積,它使查詢更容易閱讀和修改。我對「左外連接」(..)*也被稱爲(..)'outer join' *「部分感到困惑。在某些數據庫管理系統中,僅在「* 外部連接<另一個源代碼......」上寫入有效嗎? MySQL不允許這樣做,不確定其他人。它會真的和「* left outer join *」(左表中存在的每行都返回一行)而不是「* left left and right outer *」(每行存在於無論是左或右表)? – binaryLV

+0

@binaryLV這只是我記得錯了。我雖然MySQL允許你寫外部連接,左邊是隱含的,但似乎並不那麼^^我編輯了答案 – NikiC