yo,
Habe das Statement noch nicht ausprobiert
solltest du nach möglichkeit immer sofort, weil wenn es nicht zum gewünschten ergebnis führt, können wir uns die arbeit sparen. ;-)
aber habe enie verständnisfrage: "ptc.id IS NULL" - in der Tabelle ist kein NULL angegeben - sprich wenn ein Datensatz vorhanden ist ist sowohl ptc.id ptc.category besetzt. Oder verstehe ichd as jetzt falsch...?
es geht ja darum, datensätze auszuschließen, die in einem anderen datensatz einen bezug zu der ID 13 haben. und da du keine unterabfragen anwenden kannst, muss man sich einem trick verhelfen, indem man einen OUTER JOIN macht, der nur gegen diese ID 13 datensätze geprüft wird.
ein OUTER JOIN macht nun folgendes, er versucht datensätze die datensätze der beiden tabellen gemäß der join bedingung miteinander zu verbinden, so wie auch bei einem "normalen" INNER JOIN. im gegensatz aber zu einem INNER JOIN, der keinen datensatz in die ergebnismenge schreiben würde, falls die join bedingung nicht wahr ist, schreibt der OUTER JOIN immer einen Datensatz in die ergebnismenge und fehlende daten der auszugebende spalten füllt er eigenständig mit NULL werten auf, da ihm ja bestimmte daten aus einer Tabelle fehlen. Da kommen auch die NULL werte zustande, nach denen du gefragt hast.
kurz noch ein beispiel, um das anschaulicher zu machen. wenn du eine abfrage über alle mitarbeiter machst und zusätzlich noch alle kinder ausgeben willst, falls sie den welche haben, dann löst ein OUTER JOIN genau dieses problem. ein INNER JOIN würde ja die mitarbeiter ohne kinder "verschlucken", einer OUTER JOIN zeigt hingegen immer alle mitarbeiter an und falls vorhanden, auch die entsperchenden kinder.
Bezüglich %$name% das ist leider nötig, da in der Spalte mehrere Namen stehen können und nicht klar ist an welcher Stelle der gesuchte Name zu finden ist.
klingt nach unsauberen datendesign, sprich nach verletzung der 1. normalfotm. gibt es den gute gründe dafür, dass in einer spalte mehrere namen stehen ? dieses LIKE ist nämlich sehr teuer, was die performance betrifft.
Ilja