如果数据不在其中一个表中,PHP将连接三个表

如果数据不在其中一个表中,PHP将连接三个表,php,email,tracker,Php,Email,Tracker,我正在将三个表连接在一起,但是在其中一个表中没有信息,除非用户打开我们发送给他们的电子邮件 我目前正在使用此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

我正在将三个表连接在一起,但是在其中一个表中没有信息,除非用户打开我们发送给他们的电子邮件

我目前正在使用此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中可能没有客户信息,除非客户已打开电子邮件

请尝试以下操作:

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子句用于始终获取左侧部分的列和右侧部分的列(如果它们存在于联接中)

根据您的评论编辑:
尝试更改
计数(tracker.view)
零件

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

我不确定它是否有效,我无法测试它,但请尝试一下

您想要的行为是
左外连接
(也称为
左连接
)。如果另一个表中不存在该行,则只需将值设置为
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:通常使用s而不是笛卡尔积(您使用
)是一个更好的主意。

正如一个建议:设置查询格式,以便更易于阅读,并使其他人更容易帮助您:)这是可行的,但计数(tracker.view)似乎停止了左连接的工作。有没有其他方法进行计数?partI发现我必须使用group函数按客户id进行分组,然后全部工作。+1建议使用
JOIN
而不是笛卡尔积,这使查询更易于阅读和修改。我对“
左外连接
(..)也被称为(..)
外连接
”部分感到困惑。在某些DBMS中,只写“外部连接…”是否有效?MySQL不允许这样做,其他人也不确定。它是否真的与“左外连接”(左表中存在的每行返回一行)而不是“左外和右外连接”(左表或右表中存在的每行返回一行)相同?@binaryLV这只是我记错了。我认为mysql允许您只编写外部连接,这是隐含的,但似乎不是这样^^^我编辑了答案