sql >> Databáze >  >> RDS >> Mysql

Rekurzivní kategorie s jediným dotazem?

Pokud strom není příliš velký, můžete strom jednoduše sestavit v PHP pomocí chytrých referencí.

$nodeList = array();
$tree     = array();

$query = mysql_query("SELECT category_id, name, parent FROM categories ORDER BY parent");
while($row = mysql_fetch_assoc($query)){
    $nodeList[$row['category_id']] = array_merge($row, array('children' => array()));
}
mysql_free_result($query);

foreach ($nodeList as $nodeId => &$node) {
    if (!$node['parent'] || !array_key_exists($node['parent'], $nodeList)) {
        $tree[] = &$node;
    } else {
        $nodeList[$node['parent']]['children'][] = &$node;
    }
}
unset($node);
unset($nodeList);

Tím získáte stromovou strukturu v $tree s dětmi v příslušných children -slot.

Udělali jsme to s poměrně velkými stromy (> 1000 položek) a je to velmi stabilní a mnohem rychlejší než provádění rekurzivních dotazů v MySQL.



  1. SQLite Group By

  2. Mohu mít cizí klíč odkazující na sloupec v zobrazení na serveru SQL?

  3. Problémy s duplicitními daty a jak je opravit

  4. OracleDataSource vs. Oracle UCP PoolDataSource