2013-03-18 40 views
2

我想弄清楚如何使用php显示嵌套的MySQL数据。我设法把所有的“叶节点”放在一边,但后来我被困住了。我需要显示一棵整棵树以及它所有元素的关系。 这里的表如何使用PHP显示分层的“嵌套SET”数据?

category_id, name, lft, rgt 
1 Saws 1 12 
2 Chainsaws 2 7 
3 Red 3 4 
4 Yellow 5 6 
5 Circular saws 8 9 
6 Other saws 10 11 

下面是代码:

$query = 'SELECT node.name, node.lft, node.rgt 
    FROM item_cats AS node, 
     item_cats AS parent 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt AND parent.name = "' . SAWS . '" 
    ORDER BY node.lft'; 
$result = mysql_query($query, $db) or die (mysql_error($db)); 
while ($row = mysql_fetch_assoc($result)) { 
    if ($row['rgt'] == $row['lft']+1) { 
     echo '==>'; 
    } 
    echo $row['lft']; 
    echo $row['name']; 
    echo $row['rgt']; 
    echo '<br />'; 
    echo '<br />'; 
} 

而这就是我得到:

1Saws12 
2Chainsaws7 
==>3Red4 
==>5Yellow6 
==>8Circular saws9 
==>10Other saws11 
+0

什么是RGT和LFT? – 2013-03-18 07:26:15

+2

@AdamPlocher [嵌套集模型](http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/),向下滚动到'嵌套集模型'标题,第一位是关于不同的技术 – Stu 2013-03-18 07:27:55

+0

啊有趣。谢谢 – 2013-03-18 07:29:46

回答

3

基于链接的Stu给我看,本教程显示了这个查询确定深度:

SELECT node.name, (COUNT(parent.name) - 1) AS depth 
FROM nested_category AS node, 
     nested_category AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
GROUP BY node.name 
ORDER BY node.lft 

所以这样的事情应该工作:

<?PHP 
$query = 'SELECT node.name, (COUNT(parent.name) - 1) AS depth 
    FROM nested_category AS node, 
      nested_category AS parent 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    GROUP BY node.name 
    ORDER BY node.lft'; 

$result = mysql_query($query, $db) or die (mysql_error($db)); 
while ($row = mysql_fetch_assoc($result)) { 
    for ($i = 0; $i < $row['depth']; $i++) { 
     echo '==>'; 
    } 

    echo $row['name']; 
    echo '<br />'; 
    echo '<br />'; 
} 
?> 

这应该输出:

Saws 
==>Chainsaws 
==>==>Red 
==>==>Yellow 
==>Circular Saws 
==>Other Saws 
+0

谢谢,我会尝试 – 2013-03-18 07:47:01

+0

啊拍,对不起,我刚刚发现一个错误......那里'parent.name =“saws”'导致深度返回0 ...让我试着修复它。 – 2013-03-18 07:48:13

+0

是的,我注意到了!谢谢,这个作品! – 2013-03-18 07:49:46

1
<?PHP 
$query = ' 
    select if(
     count(a.name) - 1 = 0, 
     a.name, 
     concat(repeat(' ', count(a.name) - 2), '+--', b.name) 
    )name 
    from nested_category b, nested_category a 
    where node.lft between a.lft and a.rgt 
    group by b.name 
    order by b.lft'; 

$result = mysql_query($query, $db) or die (mysql_error($db)); 
while ($row = mysql_fetch_assoc($result)) echo "{$row['name']}<br>"; 
?> 

应该做某事,如:

Saws 
+--Chainsaws 
    +--Red 
    +--Yellow 
+--Circular Saws 
+--Other Saws