0

こんにちは、自己参照型のデータベース テーブルがあります。基本的には、すべての種と分類学的分類レベルが含まれています。たとえば、以下にタートル レコードがあります。

tsn_id   name  rank_id  parent_id
123       turtle       220       349

このタートル レコードの親は turtle_family レコード (同じテーブルにあります) であり、parent_id が 0 になるまで続きます。0 は動物界を意味します (animalia parent_id 0)

tsn_id   name         rank_id  parent_id
349      turtle_family 210     465

亀のように種ごとの記録を上げていきたいです。ここに私の試みがあります

<?php


function get_each_species_record(){

  $db = dbConnect();

  $query= "select * from species_records where rank_id = 220"; //this rank_id is species

  $result = $db -> Execute($query);

    while($row=$result->FetchRow())
    {
        $tsn_id= $row['tsn']; 
        $complete_name = $row['complete_name'];
        $parent_tsn = $row['parent_tsn'];
        $rank = $row['rank_id'];

        //* My objective *

        //for each species
        //take its parent tsn
        //where tsn = parent tsn
        //take that parents tsn
        //where tsn = parent tsn
        //till parent tsn = 0

       climbtree($tsn_id);

    }
}

//recursive function for each species

 function climbtree($tsn_id){

          if($parent_tsn == 0){
            return 1; //quit and go onto next speices record?

          }
          else{
            $queryone= 'select * from species_records where tsn = $parent_tsn';
            $resultone = $db -> Execute($queryone);
            return climbtree($tsn_id);
          }

  }


?>
4

1 に答える 1

0
function get_species($specie_id, $db = null) {
    if ($specie_id === '0') {
        return array();
    }
    if ($db === null) {
       $db = dbConnect();
    }
    $query = "SELECT * FROM species_records WHERE rank_id = $specie_id";
    $result = $db->Execute($query);
    $row = $result->FetchRow();
    return array_merge($row, array('parent' => get_species($row['parent_tsn'], $db);
}

これは再帰をうまく行います.array_mergeがあなたが望む結果を表示するかどうかはテストしていませんが、これは基本的に、親であるanimaliaに到達するまで、各動物が親を持つ連想配列を提供します.空の配列です。

また、各レベルで接続を再作成しないように、内部でデータベース接続を処理しました。

これはやや冗長な再帰です。親を作成するシステムに挿入される動物ごとにキャッシュテーブルを用意することをお勧めしSELECTます.

すなわち

TABLE species_records_familiy_tree
tsn_id | parents
123    | 0,2,36,77,463,349
于 2013-07-18T06:42:47.143 に答える