Mysql 左联接SQL表
表格如下: 用户id 采购用户标识,事件日期时间=采购日期 电子邮件\u已发送用户\u id、消息\u id 电子邮件\u打开用户\u id、消息\u id 电子邮件\u单击用户\u id、消息\u id 我想找一张这样的桌子: 但正如你所看到的,数字是错误的,连接似乎是不好的 我应该: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 因为它是在发送的电子邮件中打开的电子邮件,点击也是如此 我不知道我的连接/左连接有什么问题 下面是我的查询结果,
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中计算每个单独表的计数,然后加入主查询。谢谢,这样更容易