Podrías usar el EXCEPT
operador.
Contactos de primer grado:
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
Contactos de segundo grado que no son contactos de primer 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
le dice al servidor SQL que devuelva todos los resultados del primer SELECT
que NO aparecen en el segundo SELECT
.
Para contactos de tercer grado (que no son contactos de primer o segundo 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'
)
No tengo grandes esperanzas en el rendimiento, pero, por supuesto, deberá comprobarlo usted mismo.
Como nota al margen:
I can select mutual contacts but I guess it is not the right approach.
Usa INTERSECT
por esto.