2016-07-15 10 views
0

In dieser Abfrage ich versuche, E-Mail-Adresse von Benutzern, die "erstellt" im Monat Juni 2016 und noch nie zuvor bestanden haben, aber das scheint überhaupt nicht zu funktionieren.rechts beitreten in meinem SQL-und Unterabfrage

Ich brauche Benutzer E-Mails herauszufiltern, die vor Juni 2016 bestanden haben und nur die neuen im Juni erstellt bekommen 2016.

Was mit dieser Abfrage falsch zu sein scheint?

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 

Antwort

1

Zu lange und formatabhängig für eine Stellungnahme aber übrigens entsprechend indiziert, wird die folgende optimiert:

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 

Um auf die Antwort zurück, werden Sie feststellen, dass ich die Position getauscht haben der WHERE-Klausel. Mit Ausnahme von IS NULL gehören Bedingungen auf OUTER JOINED-Tabellen (sf ist die äußere verbundene Tabelle in Ihrem Beispiel) zu dem JOIN selbst. Beachten Sie auch, dass die Verwendung von RIGHT JOIN verschwindend selten ist. Normalerweise würde ein LINKER JOIN verwendet werden, und die Tabellen würden ausgetauscht.

+0

Vielen Dank, aber was ist eigentlich falsch mit meiner Version der Abfrage? Ich bin gespannt, wo der Fehler liegt. –

+0

Meine Antwort noch einmal lesen – Strawberry

+0

Joining Positionen geschaltet, in Ordnung. (aber das würde logischerweise keinen Unterschied machen, Nein?), Zeitstempel bis heute hinzufügen, okay, aber warum sf.created_at BETWEEN '2016-06-01 00:00:00' UND '2016-07-01 00: 00:00 'sollte einen Unterschied machen? Ich bin mir immer noch nicht sicher, warum das funktionieren sollte und nicht der andere. Außerdem habe ich Ihre Version der Abfrage verwendet. Gleiche Ergebnisse wie zuvor. @strawberry –