在此查询中,我尝试获取已创建的用户的电子邮件地址"在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
答案 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,并且表格会交换。