So auf den ersten Blick würde ich sagen:
In der WHERE-Bedingung muss es k1.kat LIKE '%eins%' lauten und das hier: (k2.kat NOT LIKE '%zwei%') solltest du weglassen (da du ja schon in der ON-Bedingung k2.kat LIKE ... sehen hast)
Also ungefähr so:
Code:
SELECT
*
FROM
person p
JOIN
personzukat z1
ON
z1.zuperson = p.ident
JOIN
kategorie k1
ON
k1.ident = z1.zukat
JOIN
personzukat z2
ON
z2.zuperson = p.ident
LEFT JOIN
kategorie k2
ON
k2.ident=z2.zukat AND k2.kat LIKE '%zwei%'
WHERE
LOWER(k2.kat) LIKE '%eins'
AND
k2.ident IS NULL
Die vielen LIKE '%..%' abfragen können dir aber noch das Genick brechen, da so kein Inde genutzt werden kann. Wozu muss das LIKE sein?