Mysql 左联接SQL表

Mysql 左联接SQL表,mysql,join,left-join,Mysql,Join,Left Join,表格如下: 用户id 采购用户标识,事件日期时间=采购日期 电子邮件\u已发送用户\u id、消息\u id 电子邮件\u打开用户\u id、消息\u id 电子邮件\u单击用户\u id、消息\u id 我想找一张这样的桌子: 但正如你所看到的,数字是错误的,连接似乎是不好的 我应该: email sent> email opened > email clicked 因为它是在发送的电子邮件中打开的电子邮件,点击也是如此 我不知道我的连接/左连接有什么问题 下面是我的查询结果,

表格如下:

用户id 采购用户标识,事件日期时间=采购日期 电子邮件\u已发送用户\u id、消息\u id 电子邮件\u打开用户\u id、消息\u id 电子邮件\u单击用户\u id、消息\u id 我想找一张这样的桌子:

但正如你所看到的,数字是错误的,连接似乎是不好的

我应该:

email sent> email opened > email clicked 
因为它是在发送的电子邮件中打开的电子邮件,点击也是如此

我不知道我的连接/左连接有什么问题

下面是我的查询结果,查询结果如下表所示:

WITH user AS (
  SELECT 
  DISTINCT user_id
  ,CASE WHEN DATE_DIFF('day',DATE(MAX(event_datetime)), NOW()) < 30
  THEN 'buyer_30d' 
  ELSE 'not_buyer_30d' END AS user_type

  FROM [orion_sandbox]."[Domain]_purchase" 

  GROUP BY user_id

),email_sent AS
(
  SELECT 
  u.user_id
  ,es.message_id 

  FROM [orion_sandbox]."[Domain]_user" AS u
  JOIN [orion_sandbox]."[Domain]_purchase" AS p USING(user_id)
  JOIN [orion_sandbox]."[Domain]_email_sent" AS es ON u.user_id =es.user_id

  WHERE DATE_DIFF('day',DATE(es.event_datetime), NOW())<60 AND DATE_DIFF('day',DATE(es.event_datetime), NOW()) >30
)
SELECT user_type,
COUNT(es.message_id) AS email_received,
COUNT(eo.message_id) AS email_opened,
COUNT(ec.message_id) AS email_clicked

FROM user 
JOIN email_sent AS es ON user.user_id=es.user_id
LEFT JOIN [orion_sandbox]."[Domain]_email_open" AS eo ON eo.message_id=es.message_id AND eo.user_id=es.user_id
LEFT JOIN [orion_sandbox]."[Domain]_email_click" AS ec ON ec.message_id=eo.message_id AND ec.user_id=eo.user_id 

GROUP BY user_type

在单独的CTE中计算每个单独表的计数,然后加入主查询。谢谢,这样更容易