Можете да използвате EXCEPT
оператор.
Контакти от първа степен:
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
Контакти от втора степен, които не са контакти от първа степен:
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
казва на SQL сървъра да върне всички резултати от първия SELECT
които НЕ се появяват във втория SELECT
.
За контакти от трета степен (които не са контакти от първа или втора степен):
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'
)
Не възлагам големи надежди за производителност, но разбира се ще трябва да проверите това сами.
Като странична бележка:
I can select mutual contacts but I guess it is not the right approach.
Използвайте INTERSECT
за това.