0

我不知道我做的是对还是错,请不要评判我……我想做的是,如果一条记录属于父项,那么它将与父项 ID 相关联……让我向您展示我的表架构以下。

在此处输入图像描述

我有两列 ItemCategoryID 和 ItemParentCategoryID

假设一条记录ItemCategoryID =4属于,ItemCategoryID =2那么 ID 4 上的列 ItemParentCategoryID 将具有 ItemCategoryID 的 ID。

我的意思是一个循环在它自己的表中..

但问题是如何运行选择查询:P 我的意思是显示所有父母和孩子各自的父母..

4

5 回答 5

2

这通常是一个懒惰的设计选择。理想情况下,您需要一个用于这些关系或/和一组深度的表格。如果 aparent_id的父母可以拥有它自己的parent_id,这意味着潜在的无限深度。

MySQL 不是无限嵌套深度的忠实拥护者。但是php不介意。要么在循环中运行多个查询,例如 Nil'z 的1,要么考虑获取所有行并将它们排序到 php.ini 中的数组中。如果您几乎总是得到所有行,那么最后一个解决方案很好,从而使 My​​SQL 过滤过时。

最后,考虑是否可以在数据库结构中采用更理想的方法。不要害怕为此使用多个表。

  1. 这在未来可能是一个强大的性能窃贼。每次页面加载时,无法控制的 mysql 查询量很容易失控。
于 2013-10-25T09:49:42.250 回答
0

这个问题经常出现,我什至懒得抱怨您无法使用 Google 或 SO 搜索,或者提供冗长的解释。

在这里 - 使用我制作的这个库:http: //codebyjeff.com/blog/2012/10/nested-data-with-mahana-hierarchy-library这样你就不会关闭你的数据库

于 2013-10-25T12:01:35.297 回答
0

MySQL 不支持递归查询。可以通过对存储过程的递归调用来模拟递归查询,但这是不可靠且次优的。

还有其他组织数据的方法,这些结构允许非常有效的查询。

于 2013-10-25T09:51:21.927 回答
0

我认为您不希望/可以在查询中执行此操作,因为您可以嵌套很长的路。

您应该创建一个在检索类别时调用自身的 getChilds 函数。这样您可以嵌套超过 2 层。

function getCategory()
{
   // Retrieve the category


   // Get childs
   $childs = $this->getCategoryByParent($categoryId);
}

function getCategorysByParent($parentId)
{
  // Get category

  // Get childs again.
}
于 2013-10-25T09:44:27.163 回答
0

尝试这个:

function all_categories(){
    $data   = array();
    $first  = $this->db->select('itemParentCategoryId')->group_by('itemParentCategoryId')->get('table')->result_array();
    if( isset( $first ) && is_array( $first ) && count( $first ) > 0 ){
        foreach( $first as $key => $each ){
            $second = $this->db->select('itemCategoryId, categoryName')->where_in('itemParentCategoryId', $each['itemParentCategoryId'])->get('table')->result_array();

            $data[$key]['itemParentCategoryId'] = $each['itemParentCategoryId'];
            $data[$key]['subs']                 = $second;
        }
    }
    print_r( $data );
}
于 2013-10-25T09:46:58.173 回答