2016-07-15 1 views
0

このクエリでは、2016年6月の月に "作成された"ユーザーの電子メールアドレスを取得しようとしていますが、以前は存在しませんでしたが、私のSQLとサブクエリに正しく参加しました

私は2016年6月前に存在しているユーザーの電子メールをフィルタリングし、このクエリで間違っているようだ何6月2016

で作成されただけ新しいものを取得する必要がありますか?

コメントのための依存が長すぎるとフォーマット
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' AND '2016-07-01 00: 00:00 'は違いがありますか?私はまだこれがうまくいかなくてはならないのかまだ分かりません。また、あなたのバージョンのクエリを使用しました。以前と同じ結果になりました。 @strawberry –

関連する問題