sql >> Databasteknik >  >> RDS >> Mysql

PHP Beräkna antalet downline i binärt träd

Detta är svaret efter att jag provat många sätt. Löser mitt tidigare problem. Använd bara en enskild medlemstabell ovan.

För att visa antalet downlines, vänster och höger. Jag infogar det här skriptet i HTML-medlemsträdets sida för varje användare i trädet A, ner till B/C, ner till D/E/F/G ):

<?php echo $users->downline_number($member,'_left'); ?>
<?php echo $users->downline_number($member,'_right'); ?>

Lägg till den här funktionen i User Class;

function downline_number($member,$position) {

$query  = $this->db->prepare("SELECT * FROM `member` WHERE `upline`='$member' AND `position`='$position'");
        $query->bindValue(1, $member);
        $query->bindValue(2, $position);

try{
        $query->execute();
        $rows = $query->fetch();

        if($this->count_downline($member,$position) >0 ){
        $total=$this->total_members_down($rows['username']);
        }else{
        $total=0;
        }

        return $total;      

        }catch(PDOException $e){
            die($e->getMessage());
        }   

    }   

function count_downline($member,$position) {

$query  = $this->db->prepare("SELECT * FROM `member` WHERE `upline`=? AND `position`=? ");
        $query->bindValue(1, $member);
        $query->bindValue(2, $position);
    try{
        $query->execute();
        return $rows = $query->rowCount();

        }catch(PDOException $e){
            die($e->getMessage());
        }   
    }   

function total_members_down($upline,$reset=0) {
global $num;
if ($reset==0) { $num=1; }

$query  = $this->db->prepare("SELECT * FROM `member` where `upline`='$upline' order by id asc");
        $query->bindValue(1, $upline);
try{

$query->execute();

if ($upline !='') {

            if ($this->total_down($upline) > 0 ) {
                    while ($rows = $query->fetch() ) {
                    $num++;
                    $this->total_members_down($rows['username'],$num);
                    } 
                    return $num;
            } else { 
            return $num;
            }
} else { $num=0; return $num;  }            

     }catch(PDOException $e){
            die($e->getMessage());
        }   
}   

function total_down($upline) {

$query  = $this->db->prepare("SELECT * FROM `member` where `upline`='$upline' order by id asc ");
        $query->bindValue(1, $upline);

    try{
        $query->execute();
        return $rows = $query->rowCount();

        }catch(PDOException $e){
            die($e->getMessage());
        }   
    }   

och det fungerar med att visa binär medlemsträdstruktur. Att visa medlems-ID är inte bifogat här, orsakade det enkelt sätt. Bara vänster och höger downlines nummer.

Hoppas det här inlägget hjälper andra som behöver det. Något förslag på bättre sätt?




  1. Sliddäck och prover från #SQLintersection

  2. LocalDB-distribution på klientdator

  3. MySQL IN() för två värden/matris?

  4. Hibernate JPA, MySQL och TinyInt(1) för Boolean istället för bit eller char