0

3 つのテーブルを結合しようとしていますが、送信したメールをユーザーが開かない限り、テーブルの 1 つには情報がありません。

現在この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 に顧客情報が含まれていない可能性があるためです。

4

2 に答える 2

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 を使用することをお勧めします ( で行ったこと,)。

于 2011-09-22T07:11:39.370 に答える
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 

うまくいくかどうかはわかりませんが、テストすることはできませんが、試してみてください

于 2011-09-22T07:10:25.677 に答える