LEFT JOIN soll bestimmtes NICHT finden

InFlame

Erfahrenes Mitglied

Hallo,

ich bin am verzweifeln
Folgendes:
Ich möchte aus 1 Tabelle Datensätze haben. Allerdings soll er nur die anzeigen (dsb_order.ordIdNo), die NICHT in einer anderen Tabelle sind (mtl_fragen_code.orderID). Außerdem soll er auch nur bestimmte Datensätze nehmen, die in einem bestimmten Zeitraum liegen (Between). Das funktioniert auch.

Doch leider gibt er mir bei folgendem Code immer nur den Datensatz aus, der IN der anderen Tabelle steht. Dabei soll er es genau umgekehrt machen (alles auser diesen einen). Wenn ich != in ein = änder, findet er gar nichts mehr...

SQL:
SELECT ordIdNo,ordTitle,ordDate,ordLastName,ordEMail FROM dsb_order 
LEFT JOIN mtl_fragen_code 
ON (mtl_fragen_code.orderID=dsb_order.ordIdNo) 
WHERE dsb_order.ordId != mtl_fragen_code.orderID 
&& dsb_order.ordDate BETWEEN '20060101000000' AND NOW()-5000000 
ORDER BY ordDate DESC

Mysql: 4.0.24
Was mache ich Falsch?
 
Zuletzt bearbeitet von einem Moderator:
Versuche es mal so:
SQL:
SELECT 
  ordIdNo,
  ordTitle,
  ordDate,
  ordLastName,
  ordEMail 
FROM dsb_order
LEFT JOIN mtl_fragen_code
  ON (mtl_fragen_code.orderID=dsb_order.ordIdNo)
WHERE mtl_fragen_code.orderID IS NULL
  AND dsb_order.ordDate BETWEEN '20060101000000' AND NOW()-5000000
ORDER BY ordDate DESC
Gruß hpvw
 
hpvw hat gesagt.:
Versuche es mal so:
SQL:
SELECT 
  ordIdNo,
  ordTitle,
  ordDate,
  ordLastName,
  ordEMail 
FROM dsb_order
LEFT JOIN mtl_fragen_code
  ON (mtl_fragen_code.orderID=dsb_order.ordIdNo)
WHERE mtl_fragen_code.orderID IS NULL
  AND dsb_order.ordDate BETWEEN '20060101000000' AND NOW()-5000000
ORDER BY ordDate DESC
Gruß hpvw
Juhu, es geht! 2 Stunden rumprobiert und so einfach kanns sein... Vielen vielen Dank!
Kannst du mir sagen, warum mein Versuch nicht ging?
 
InFlame hat gesagt.:
Kannst du mir sagen, warum mein Versuch nicht ging?
Nicht so richtig, da ich den Unterschied zwischen Deiner ordId und der ordIdNo nicht kenne. Ich bin mir auch nicht sicher, wie sich null bei einem Ungleich-Vergleich verhält. Es ist für Ungleich bei den Vergleichsoperatoren zwar nicht explizit beschrieben, ein normaler Vergleich liefert jedoch null, wenn mindestens eins der Argumente null ist, anstatt 0 oder 1.

Fraglich ist, ob null als 0 oder 1 ausgewertet wird. Wenn Deine ordId der ordIdNo entspricht und Du überhaupt Datensätze erhältst, vermutlich als 1.

Wenn Dir das Verhalten eines left join bekannt ist (das nehme ich an, sonst hättest Du es nicht so versucht), solltest Du Dir aber erklären können, warum mein Beispiel funktioniert.

Gruß hpvw
 
Ohne auf das von dir oben geschriebene einzugehen (muss darüber noch etwas länger nachdenken :)) habe ich schon wieder ein neues Problem.

Bei den ganzen Spielereien ist mir aufgefallen, dass manche Kunden bis zu 10 mal Ihre Bestelung abgeschickt haben und sie somit öfters in der Datenbank (dsb_order) stehen. Jetzt möchte ich aber, dass jeder Kunde nur einmal aus dsb_order ausgewählt wird. Zur identifizierung hätte ich vorerst die Email Adresse (ordEMail) genommen. Wie kann ich denn jetzt die Email Adresse einmal zulassen. Wenn sie öfters vorkommt, sollen diese Datensätze nicht übernommen werden. Der erste aber schon!

Leider habe ich überhaupt keine Ahnung, wie es gehen könnte und ob es überhaupt geht. Vielleicht muss ich das doch mit PHP Abfragen?
Wäre für jede Hilfe sehr dankbar!!

Noch etwas anderes: Habe ein TIMSTAMP Feld in der DB und damit alle einträge von Heute auswählen. Ich bekomm es einfach nicht hin.
Habe es hiermit versucht:
SQL:
SELECT * FROM mtl_fragen_code WHERE zeit = DAYOFMONTH(NOW())
Ging natürlich nicht...
 
Zuletzt bearbeitet von einem Moderator:
Bevor du den Datensatz einträgt, machst du eine Abfrage, um alle DS abzufragen mit der E-Mail Adresse des aktuellen.

Mit mysql_num_rows() (falls du PHP verwendest), kanns du dann prüfen wie viele Datensätze es mit dieser E-Mail Adresse gibt, ist die Zahl > 0, ist er schon vorhanden, ansonsten nicht...
 
aquasonic hat gesagt.:
Bevor du den Datensatz einträgt, machst du eine Abfrage, um alle DS abzufragen mit der E-Mail Adresse des aktuellen.

Mit mysql_num_rows() (falls du PHP verwendest), kanns du dann prüfen wie viele Datensätze es mit dieser E-Mail Adresse gibt, ist die Zahl > 0, ist er schon vorhanden, ansonsten nicht...
Danke für deine Antwort.
Gibt es keine Möglichkeit das im QUERY zu machen?
 
Beim INSERT kannst du ja keine Bedingungen angeben. Du kannst bei SQL ebenfalls keine IF-Bedingungen machen (also soweit ich weiss), und dies wäre ja genau was du bräuchtest.

Laut meinen Kenntnissen kannst du das somit nicht.
 
Allerdings geht es doch erstmal nur um das Auslesen der Datensätze.
Ich möchte bereits im SELECT die Emails überprüfen.
 
Zurück