# mark members with no referrals as done, an everyone else as not done. # NOTE: I'm assuming a new column named is_done as a work column. If you prefer # not to have such a column in your database, you can use a temporary table instead. $DB->do("update registered_users set is_done=0") $DB->do("update registered_users set is_done=1 where MemberID not in (select referrer_id from registered_users"); while (1) { # Do we have any members that aren't done yet? my @tmp = $DB->selectrow_array("select count(*) from registered_users where is_done=0"); last unless $tmp[0] > 0; # Perform computation for all members whose referrals are all "done" $DB->do(qq{ UPDATE registered_users SET is_done=1, <<>> FROM registered_users WHERE is_done=0 AND MemberID not in ( SELECT referrer_id WHERE is_done=0 ) }); }