MySQL Forums
Forum List  »  Performance

Recusive Search
Posted by: Marco Schierhorn
Date: September 29, 2005 04:26PM

Hey MySQL Specialists, :-)

i´ve got the following problem.
We want to search a table for friends of a specified member.
After that we want to search the friends of our friends and so on.
Until the 4th degree.
This is the table :

mem_id bigint(20)
frd_id bigint(20)

e.g. we´ve the following values :

mem_id frd_id
1 2
1 3
1 5
2 1
2 3
2 4
2 6
3 1
3 2

The first statement should show our friends ( 2,3,5 ), the second all friends
of our friends which are not in my network ( 4,6 ) ( 2nd degree )
The third statement should show the friends of these ( 3rd degree ).

We wrote a recursive function in php :

function return_countfriensdegrees($member){

// level 1 ermitteln
$members_lev1d = gForum::return_friends($member);
$members_lev1 = array_unique($members_lev1d);

// level 2 ermitteln
foreach($members_lev1 as $value){
$res = gForum::return_friends($value);
foreach($res as $val) $members_lev2d[] = $val;
unset($res);
}
$members_lev2 = array_unique($members_lev2d);
$members_lev2 = array_diff($members_lev2, $members_lev1);
$members_lev2 = array_diff($members_lev2, array("0" => $member));

// level 3 ermitteln
foreach($members_lev2 as $value){
$res = gForum::return_friends($value);
foreach($res as $val) $members_lev3d[] = $val;
unset($res);
}
$members_lev3 = array_unique($members_lev3d);
$members_lev3 = array_diff($members_lev3, $members_lev2);
$members_lev3 = array_diff($members_lev3, $members_lev1);
$members_lev3 = array_diff($members_lev3, array("0" => $member));

// level 4 ermitteln
foreach($members_lev3 as $value){
$res = gForum::return_friends($value);
foreach($res as $val) $members_lev4d[] = $val;
unset($res);
}
$members_lev4 = array_unique($members_lev4d);
$members_lev4 = array_diff($members_lev4, $members_lev3);
$members_lev4 = array_diff($members_lev4, $members_lev2);
$members_lev4 = array_diff($members_lev4, $members_lev1);
$members_lev4 = array_diff($members_lev4, array("0" => $member));

$retarray = array("1" => sizeof($members_lev1), "2" => sizeof($members_lev2), "3" => sizeof($members_lev3), "4" => sizeof($members_lev4));
return $retarray;
}

It works fine, but i think there will be a better solution.
I remember there was the possibilty to do this with minus in Oracle.
So i´ve tested the 2nd degree with a mySQL Statement like this :

SELECT COUNT( DISTINCT (n2.frd_id) )
FROM network n1, network n2
LEFT JOIN network n3 ON ( n2.frd_id = n3.frd_id AND n1.mem_id = n3.mem_id )
WHERE n1.mem_id =1
AND n1.frd_id = n2.mem_id
AND n3.frd_id IS NULL

It works as well, but i think there also will be a better solution...

I would really appreciate if someone can help me.

Cheers

Marco

info@marcoschierhorn.de



Edited 1 time(s). Last edit at 09/29/2005 04:26PM by Marco Schierhorn.

Options: ReplyQuote


Subject
Views
Written By
Posted
Recusive Search
1608
September 29, 2005 04:26PM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.