Du kan använda EXCEPT
operatör.
Första gradens kontakter:
SELECT contact_2 FROM contact WHERE contact_1 = 'gulsah'
Andra gradens kontakter som inte är första gradens kontakter:
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
säger åt SQL-servern att returnera alla resultat från den första SELECT
som INTE visas i den andra SELECT
.
För tredje gradens kontakter (som inte är första eller andra gradens kontakter):
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'
)
Jag hyser inga stora förhoppningar om prestanda, men du måste naturligtvis kontrollera detta själv.
Som en sidoanteckning:
I can select mutual contacts but I guess it is not the right approach.
Använd INTERSECT
för detta.