Hier leest u hoe u de zoekopdracht uitvoert met behulp van een breedte-eerst, kortste pad-zoekopdracht, met behulp van JOIN. Er zit geen magie in dit algoritme, omdat we MySQL gebruiken om ons antwoord te vinden, en we gebruiken geen fancy zoekalgoritme dat enige vorm van heuristiek of optimalisatie gebruikt.
Mijn 'vrienden'-tabel heeft unidirectionele relaties, dus we hebben duplicaten in die zin dat zowel '1 tot 2' als '2 tot 1' worden opgeslagen. Ik sluit is_active ook uit omdat de implementatie duidelijk zal zijn:
Dit zijn de gegevens:
member_id friend_id
1 2
1 3
1 4
2 1
2 3
2 5
2 6
3 2
3 1
4 1
5 2
6 2
6 7
7 6
7 8
8 7
We hebben lid 1 geselecteerd, en we vragen is 1 vrienden met 7, een vriend van een vriend, etc? Een telling van 0 betekent nee, en een telling van 1 betekent ja.
SELECT COUNT(*)
FROM friends f1
WHERE f1.member_id = 1
AND f1.friend_id = 7
Zo nee, zijn ze dan een vriend van een vriend?
SELECT COUNT(*)
FROM friends f1
JOIN friends f2
ON f2.member_id = f1.friend_id
WHERE f1.member_id = 1
AND f2.friend_id = 7
Zo nee, dan vriend van een vriend van een vriend?
SELECT COUNT(*)
FROM friends f1
JOIN friends f2
ON f2.member_id = f1.friend_id
JOIN friends f3
ON f3.member_id = f2.friend_id
WHERE f1.member_id = 1
AND f3.friend_id = 7
En zo verder...
De derde zoekopdracht zou het pad '1 to 2', '2 to 6' en '6 to 7' vinden, waarbij de telling van 1 wordt geretourneerd.
Elke zoekopdracht wordt duurder (vanwege het grotere aantal joins), dus misschien wilt u de zoekopdracht op een bepaald moment beperken. Een cool ding is dat deze zoekopdracht van beide kanten naar het midden werkt, wat een eenvoudige optimalisatie is die wordt voorgesteld voor zoekopdrachten met de kortste paden.
Hier leest u hoe u aanbevelingen voor wederzijdse vrienden kunt vinden voor lid 1:
SELECT f2.friend_id
FROM friends f1
JOIN friends f2
ON f2.member_id = f1.friend_id
LEFT JOIN friends f3
ON f3.member_id = f1.member_id
AND f3.friend_id = f2.friend_id
WHERE f1.member_id = 1
AND f2.friend_id <> f1.member_id // Not ourself
AND f3.friend_id IS NULL // Not already a friend