Tach!
Eine Abfrage, für alle Personen aus Hamburg und die bereits Paris besucht haben, funktioniert prächtig:
select p.*,z.* from personen as p left join ziele as z on p.idnr=z.pidnr where p.ort like '%Hamburg%' AND z.ziel like '%Paris%'
Was soll das Ergebnis sein? Willst du eigentlich nur die Personen-Daten haben und das z.* in der SELECT-Klausel ist eigentlich überflüssig? Oder brauchst du auch die Ziele-Daten? Wenn nicht, wäre statt eines Joins eine Correlated Subquery in einem EXISTS() in der WHERE-Klausel verständlicher. Diese Subquery müsste Datensätze mit pidnr gleich p.idnr und z.ziel like '%Paris%' liefern.
Aber wenn ich jetzt alle Personen aus Hamburg wissen möchte, die noch NICHT in Paris waren, funktioniert z.B. die Abfrage nicht korrekt:
select p.*,z.* from personen as p left join ziele as z on p.idnr=z.pidnr where p.ort like '%Hamburg%' AND z.ziel not like '%Paris%'
Wenn sie noch nicht in Paris waren, wird es vermutlich keinen ziele-Datensatz mit Paris geben. Ein Left Join liefert dann NULL in den ziele-Daten.
Mit obiger Subquery müsstest du nur NOT vor das EXISTS() schreiben.
Kommst du mit den Hinweisen zurecht oder brauchst du weitergehende Unterstützung? Grundlegende Informationen zu EXISTS() gibt es im MySQL-Handbuch: Subqueries with EXISTS or NOT EXISTS.
dedlfix.