【问题标题】:Using Nested Query with JOIN in Codeigniter, MysQL在 Codeigniter、MySQL 中使用带有 JOIN 的嵌套查询
【发布时间】:2012-03-13 17:40:16
【问题描述】:

我的 codeigniter 项目中有两个 db 表。简而言之,

page                                        page_lang
-------------------------------------       ----------------------------
id_page | id_menu | id_parent | level       id_page |  title     | etc..
-------------------------------------       ----------------------------
   1    |    1    |     0     |   0            1    | Name 1     | etc..
   2    |    1    |     1     |   1            2    | Name 1.1   | etc..
   3    |    1    |     2     |   2            3    | Name 1.1.1 | etc..
   4    |    1    |     2     |   1            4    | Name 1.2   | etc.

我正在尝试创建一个下拉选择框,其中包含所有嵌套缩进的页面作为输出;

<option value="id_page">Name 1</option>
<option value="id_page">&nbsp;»&nbsp;Name 1.1</option>
<option value="id_page">&nbsp;&nbsp;&nbsp;-&nbsp;Name 1.1.1</option>
<option value="id_page">&nbsp;»&nbsp;Name 1.2</option>

在这种情况下,需要加入 page 和 page_lang 并创建一个递归循环,我问。

但我一直致力于设计尽可能快的代码。感谢您的帮助。

【问题讨论】:

  • 是的,你需要一个递归函数。将您的页面从数据库中按父级升序排序,然后您可以运行深度优先算法,该算法跟踪深度,并在页面名称前面加上深度级别的缩进。
  • 策略已注明,谢谢,但我对构建递归不太满意。

标签: php mysql codeigniter join nested


【解决方案1】:

你的递归函数看起来像这样

function recursivePageOptions( $level, $nodes ) {
  $set = array();
  foreach ($nodes as $node) {
    $nest = '';
    for($x=1; $x<=$level; $x++)
      $nest.= ' &nbsp;';
    $page = '<option value="'.$node['page']['id'].'">';
    $page.= $nest . $node['page']['title'] . '</option>';
    $set[] = $page;
    if (isset($node['children'])) {
      $set = array_merge(
        $set,
        recursivePageOptions( $level+1, $node['children'] );
      );
    }
  }
  return $set;
}

所以在调用这个递归函数之前你需要做的就是将你的页面信息放入一个如下所示的数组结构中:

[
  'My Homepage' => [
    'page' => ['My Homepage', 24, ... ],
    'children' => [
      'Level 1 Page' => [
        'page' => ['Level 1 Page', 39, ... ],
        'children' => [
          'Level 2 Page' => [
            'page' = ['Level 2 Page', 51, ... ]
          ]
        ]
      ],
      'Another Level 1 Page' =< [
        'page' => ['Another Level 1 Page', 56, ... ]
      ]
    ]
  ]
]

这部分的细节由您决定,本质上您将从数据库中获取行并以这样一种方式循环它们以生成类似于上述的数组结构。

【讨论】:

  • 这是非常有用的 php 方面。事情是今天是第 4 天,我仍在尝试找到一种有效的方法来使其成为一个单一的 sql 查询来获取上述数组。
  • 我终于找到了处理数据的方法,最终结果与孩子一起。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多