嵌套/子查询

时间:2011-01-27 08:48:41

标签: php mysql multidimensional-array

我正在尝试用PHP和mySQL编写一个高度动态的导航生成器。

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

我已经获得了所有PHP代码来创建一个多维数组,然后生成HTML。这很好。

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

tbl:navigation

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:handle

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执行此操作?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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']
    );
  }
}