私は階層的な SQL クエリは好きではありません。もちろん、それらは多くの SQL データベースでサポートされていますが、イン メモリ ポスト プロセッシングが好きです。これは非常にシンプルで単純であり、さらに重要なことは、簡単に改善したり、バグを修正したりできるからです。データ。
おおよその作業は次のとおりです。次の例は PHP のものです。これは、同じ Manager->Employee 関係を読み取り、階層全体を JSON オブジェクトにエクスポートします。
あなたの場合、最終オブジェクトを JSON ではなく XML にシリアライズする必要があります。
// Connect to your Database
mysql_connect("localhost", "username", "password") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());
// Select accounts
$response = mysql_query("SELECT EmployeeID as id, ManagerID as parentid, name, title, description, phone, email, photo FROM accounts") or die(mysql_error());
// create some class for your records
class Account
{
public $id = 0;
public $parentid = null;
public $name = '';
public $title = '';
public $desciption = '';
public $phone = '';
public $email = '';
public $photo = '';
public $children = array();
public function load($record) {
$this->id = intval($record['record_id']);
$this->parentid = intval($record['parentid']);
$this->title = $record['title'];
$this->name = $record['name'];
$this->description = $record['description'];
$this->phone = $record['phone'];
$this->email = $record['email'];
$this->photo = $record['photo'];
}
}
// create hash and group all children by parentid
$children = Array();
while($record = mysql_fetch_array( $response ))
{
$account = new Account();
$account->load($record);
if( !isset($children[$account->parentid])) {
$children[$account->parentid] = array();
}
array_push($children[$account->parentid], $account);
}
// Create hierarchical structure starting from $rootAccount
function recursiveLoadChildren($parent, $children) {
if(isset($children[$parent->id])) {
foreach($children[$parent->id] as $id => $account) {
array_push($parent->children, $account);
recursiveLoadChildren($account, $children);
}
}
}
$rootAccount = $children[0][0];
recursiveLoadChildren($rootAccount, $children);
// serialize $rootAccount object including all its children into JSON string
$jsonstring = json_encode($rootAccount);