2016-07-15 33 views
0

在此查詢中,我試圖獲取2016年6月份「創建」的用戶的電子郵件地址,但之前從未存在過,但這似乎根本不起作用。正確加入我的sql和子查詢

我需要篩選出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

過長,格式扶養髮表評論,但順便說一下,適當的索引,下面是優化:

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,並將表格交換。

+0

謝謝,但請注意指出我的查詢版本實際上出了什麼問題?我很想知道錯誤在哪裏。 –

+0

重新閱讀我的回答 – Strawberry

+0

加入職位切換,好吧。 (但這不會在邏輯上有所作爲,否?),添加時間戳到目前爲止,但爲什麼sf.created_at BETWEEN'2016-06-01 00:00:00'和'2016-07-01 00: 00:00'應該有所作爲?我仍然不確定爲什麼這應該起作用,而不是另一個。另外,我確實使用了您的查詢版本。與以前相同的結果。 @strawberry –