Potresti usare EXCEPT
operatore.
Contatti di primo grado:
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
Contatti di secondo grado che non sono contatti di primo grado:
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
dice al server SQL di restituire tutti i risultati dal primo SELECT
che NON compaiono nel secondo SELECT
.
Per i contatti di terzo grado (che non sono contatti di primo o secondo grado):
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'
)
Non nutro grandi speranze per le prestazioni, ma ovviamente dovrai verificarlo tu stesso.
Come nota a margine:
I can select mutual contacts but I guess it is not the right approach.
Usa INTERSECT
per questo.