右边加入我的sql和子查询

时间:2016-07-15 05:58:53

标签: mysql

在此查询中,我尝试获取已创建的用户的电子邮件地址"在2016年6月,从未存在过,但这似乎根本不起作用。

我需要过滤掉2016年6月之前存在的用户电子邮件,并且只获取2016年6月创建的新电子邮件。

这个查询有什么问题?

select DISTINCT SF.customer_email, SF.created_at,  historcialEmails.customeremail,
historcialEmails.createdAt 
FROM 
sales_flat_order SF
RIGHT JOIN
(
select SFO.customer_email
AS customeremail,
SFO.created_at as createdAt
FROM 
sales_flat_order SFO 
WHERE
DATE(SFO.created_at) <= '2016-05-31'
) AS historcialEmails
ON historcialEmails.customeremail = SF.customer_email
WHERE
YEAR(DATE(SF.created_at)) = '2016'
AND 
MONTH(DATE(SF.created_at)) = '6'
AND 
SF.customer_email IS NULL

1 个答案:

答案 0 :(得分:1)

太长且格式依赖于评论,但顺便说一句,适当地编入索引,以下内容已经过优化:

sf.created_at <= '2016-05-31 00:00:00'
...
AND sf.created_at BETWEEN '2016-06-01 00:00:00' AND '2016-07-01 00:00:00'
WHERE sf.customer_email IS NULL

要回到答案,您会注意到我已经交换了WHERE子句的位置。除IS NULL外,OUTER JOINED表上的条件(sf是示例中的外连接表)属于JOIN本身。另请注意,使用RIGHT JOIN非常罕见。通常会使用LEFT JOIN,并且表格会交换。