echo $begrüßung;
SELECT InteressentenNr FROM interessentenundobjekte WHERE InteressentenNr NOT IN (SELECT InteressentenNr FROM interessentenundobjekte WHERE ObjektNr = '331') AND ObjektNr = '330'
Mein Problem ist jetzt die Abfrage ohne Subselect zu schreiben
Nicht alle Subselect-Lösungen lassen sich ohne Subselect darstellen. Diese hier scheint mir so ein Fall zu sein.
Du möchtest die Interesenten für das Objekt 330 haben, davon aber die Interessenten des Objekts 331 ausschließen. Das heißt, dass du alle Interessenten für beide Objekte in einer Ergebnismenge haben musst, um dann irgendwie die "falschen" herauszufiltern. Die beiden Ergebnismengen dürfen sich zunächst nicht beeinflussen, was sie aber tun, wenn man sie miteinander verbindet. Vielleicht gelingt es mit ANDs und ORs und DISTINCT da was zurechtzufummeln, das erscheint mir aber dann genauso genial wie undurchsichtig zu werden.
Eine übersichtlichere Möglichkeit ist, die beiden Schritte nacheinander auszuführen. Die erste Ergebnismenge muss zwischengelagert werden.
Dafür bieten sich User Variablen an, die kennt MySQL auch schon eine Weile. Eine Uservariable kann aber nur einen Wert aufnehmen, keine Ergebnismenge. Man kann die Werte aber als String aneinanderfügen.
Nun wird noch eine Möglichkeit benötigt, diesen Ausdruck auszuwerten. MySQL kennt kein eval(), aber es kann mit für den Zweck ausreichenden regulären Ausdrücken was anfangen.
Zuerst wird nun der String mit den auszuschließenden Interessenten in einer Uservariable zusammengesetzt. In der Annahme, dass 0 kein gültiger Wert für InteressentenNr ist, wird zuerst die Uservariable grundinitialisiert
SET @var = '0';
Damit umgehen wir später das Entfernen eines überflüssigen Trennzeichens (|).
Die Werte der Interessenten für Objekt 331 werden jeweils mit | getrennt angehängt:
SELECT @var := CONCAT(@var, '|', InteressentenNr) FROM interessentenundobjekte WHERE ObjektNr = '331';
Ein SELECT @var; liefert jetzt etwas wie 0|115|220
@var wird nun in die Hauptabfrage integriert:
SELECT InteressentenNr FROM interessentenundobjekte WHERE InteressentenNr NOT RLIKE @var AND ObjektNr = '330';
Die drei Befehle müssen nacheinander und innerhalb einer Verbindung ausgeführt werden, da die UserVariablen verbindungsspezifisch sind und am Verbindungsende gelöscht wird.
echo "$verabschiedung $name";