Możesz użyć EXCEPT
operatora.
Kontakty pierwszego stopnia:
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
Kontakty drugiego stopnia, które nie są kontaktami pierwszego stopnia:
SELECT
contactB.contact_2
FROM
contact AS contactB
INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
EXCEPT
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
EXCEPT
nakazuje serwerowi SQL zwrócić wszystkie wyniki z pierwszego SELECT
które NIE pojawiają się w drugim SELECT
.
W przypadku kontaktów trzeciego stopnia (które nie są kontaktami pierwszego ani drugiego stopnia):
SELECT
contactC.contact_2
FROM
contact AS contactC
INNER JOIN contact AS contactB ON contactB.contact_2=contactC.contact_1
INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
EXCEPT
(
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
UNION
SELECT
contactB.contact_2
FROM
contact AS contactB
INNER JOIN contact AS contactA ON contactA.contact_2=contactB.contact_1
WHERE contactA.contact_1 = 'gulsah'
)
Nie wiążę wielkich nadziei z wydajnością, ale oczywiście musisz to sprawdzić sam.
Na marginesie:
I can select mutual contacts but I guess it is not the right approach.
Użyj INTERSECT
w tym celu.