2011-01-27 196 views
0

我正在尝试使用PHP和mySQL编写高度动态的导航生成器。嵌套/子查询

我旅行得很好,但我已经到了一个我不知道该去哪里的地步。

我已经有了所有的PHP代码来创建一个多维数组,然后生成HTML。这工作正常。

我的数据库的结构方式如下:(我省略了不相关的某些行..回答这个问题时,请记住这一点。)

TBL:导航

id  |name  |parent |handle 
1  | home  | 0  | 1 
2  | about  | 0  | 2 
3  | contact | 0  | 4 
4  | products | 0  | 3 
5  | computers | 4  | 3 

TBL :处理

id  |handle  |redirect_to 
1  | home  | 0 
2  | about  | 0 
3  | contact-us | 0 
4  | products | 0 
5  | products/computers | 0 

我想实现的是导致导航类似这样每行的东西的print_r()...

Array (
    [id]=>1 
    [name]=>home 
    [parent]=>0 
    [handle]=>Array (
     [id]=>1 
     [handle]=>home 
     [redirect_to]=>0 
) 

是否可以在mySQL级别执行此操作,还是必须使用PHP执行此操作?

+1

为什么不使用简单的连接? – Keeper 2011-01-27 08:51:55

+0

你建议什么类型的连接? – ajdi 2011-01-27 15:01:42

回答

0

在MySQL中没有内置的层次结构概念(不是我所知道的),所以我想你必须在php中这样做。如果在编写查询时遇到问题,请考虑使用the nested set model

0

只需在MySQL中使用连接来获取正确的句柄,从handles中选择的所有字段都将显示在数组中,并使用数据库中指定的正确键/值。

SELECT 
`navigation`.*, 
`handles`.`redirect_to`, 
`handles`.`handle` 
FROM `navigation` 
INNER JOIN `handles` ON 
`navigation`.`handle` = `handles`.`id` 

这只是关于从MySQL等关系数据库中组织和提取数据的冰山一角。知道在哪里使用哪种查询类型可以非常强大。如果您将查询嵌入其他查询的循环中,则可以一次获取所有数据。

0

你不能直接在mysql中这样做,它也需要一些PHP。

SELECT 
    n.id as nav_id, 
    n.name as nav_name, 
    n.parent as nav_parent, 
    n.handle as nav_handle, 
    h.id as handle_id, 
    h.handle as handle_handle, 
    h.redirect_to as handle_redirect_to 
FROM navigation n 
    LEFT JOIN handle h ON n.handle_id = h.id 

$nav = array(); 
foreach($results as $data) { 
    array_filter($data); // removes null values 

    $link = array(
    'id' => $data['nav_name'], 
    'name' => $data['nav_name'], 
    'parent' => $data['nav_parent'] 
); 

    if (isset($data['handle_id'])) { 
    $link['handle'] = array(
     'id' => $data['handle_id'], 
     'handle' => $data['handle_handle'], 
     'redirect_to' => $data['handle_redirect_to'] 
    ); 
    } 
}