2016-11-30 5 views
0

Hi: Ich kämpfe mit dem Abrufen nur der E-Mails von meiner MarketingImport-Tabelle, die nicht in meiner HardBounce-Tabelle vorhanden sind.MySQL (OSX) LEFT JOIN funktioniert nicht wie erwartet

Ich versuchte verschiedene Ansätze für die LINKE JOIN, aber ich bekomme immer die gesamte marketingTable (alle 300K Datensätze). Ich sollte nur ungefähr 220K Datensätze bekommen, da es in meiner hardBounce-Tabelle ungefähr 80K "schlechte" E-Mails gibt: Diese sollten von meinen Ergebnissen ausgeschlossen sein.

Ich habe auch versucht, WHERE mit AND (um es Teil der ON-Klausel zu machen), aber die gleichen Ergebnisse erhalten.

Das ist mein SQL:

SELECT marketingImport.email FROM marketingImport 
LEFT JOIN hardBounce ON marketingImport.email = hardBounce.email 
WHERE hardBounce.email IS NULL; 

Tables:

-marketingImport enthält ein Feld 'E-Mail', die eine varchar (255), Nullable-Index

-hardBounce ein einzelnes Feld enthält 'email' was ist ein varchar (255), Nullable UNIQUE Index (nicht PK)

Was vermisse ich? Ich habe alle Beiträge gelesen ... und meine Augen wässern jetzt ...

Danke.

+0

Es scheint, dass alle vorgeschlagenen Methoden ALLE Datensätze aus der richtigen Tabelle zurückgeben und die Bedingung NOT IN/NOT EXISTS/IS NULL ignorieren. Die Leistung ist besser am besten mit NOT IN, dann LINKER JOIN, dann nicht EXISTS --- aber ich bekomme immer noch nicht meine Ergebnisse :(. –

+0

Mystery aufgelöst. Es scheint, dass meine E-Mail-Feld HardBounce-Tabelle '0D' über alle 80K angehängt hatte Dies ist die wahrscheinlichste Fehlfunktion. Dieser Anhang ist wahrscheinlich während des Exports/CSV/Import-Vorgangs aufgetreten. Ich UPDATE alle Zeilen mit einer REPLACE-Klausel. Dann, Alle unten aufgeführten Vorschläge funktionierten, danke für Hilfe. Ich bleibe beim LINKEN JOIN, Das funktioniert jetzt wie angekündigt (auf MySQL) ... –

+0

Das ist SEHR gut zu hören, ich nahm an, dass es ein Datenproblem gewesen sein muss, da die 2 Fragen unten nicht funktionierten!;) Froh, dass Sie es haben sortiert ... der LEFT JOIN ist wahrscheinlich eine gute Wahl dafür. – Nerdwood

Antwort

1

Wie wäre es mit einer Unterabfrage anstelle von LEFT JOIN?

SELECT marketingImport.email 
FROM marketingImport 
WHERE marketingImport.email NOT IN (
    SELECT hardBounce.email 
    FROM hardBounce 
); 
+0

Hi: das scheint nicht gültig zu sein MySQL-Syntax ... Ich bekomme einen Syntaxfehler in SQL-Workbench ... Ich mache mir auch Sorgen, dass Unterabfrage Ineffektivität ergeben würde, aber bin bereit zu versuchen :) –

+0

Sorry, verließ das "IS" da drin! Sollte nur "NICHT IN" sein. – Nerdwood

+0

dracks: das gleiche Ergebnis: alle 274580 Datensätze werden in 0.0020 sec zurückgegeben –

0

Try NOT EXISTS verwenden:

SELECT marketingImport.email FROM marketingImport 
WHERE NOT EXISTS (
    SELECT 1 FROM hardBounce WHERE hardBounce.email = marketingImport.email 
); 

Und ich denke, es null Wert in hardBounce sein können, so dass Sie alle E-Mails aus marketingImport bekommen können.

+0

danke: versuchte dies auch; Alle Datensätze werden zurückgegeben ... –