【问题标题】:mysql | PHP | Join within own tablemysql | PHP |在自己的表内加入
【发布时间】:2013-10-25 20:01:35
【问题描述】:

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

我有两列 ItemCategoryID & ItemParentCategoryID

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

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

但问题是如何运行选择查询:P 我的意思是向他们的父母展示所有的父母和孩子..

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

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

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

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

    1. 这在未来可能是一个强大的性能窃贼。每次页面加载时,无法控制的 mysql 查询量很容易失控。

    【讨论】:

      【解决方案2】:

      试试这个:

      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 );
      }
      

      【讨论】:

        【解决方案3】:

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

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

        function getCategory()
        {
           // Retrieve the category
        
        
           // Get childs
           $childs = $this->getCategoryByParent($categoryId);
        }
        
        function getCategorysByParent($parentId)
        {
          // Get category
        
          // Get childs again.
        }
        

        【讨论】:

          【解决方案4】:

          MySQL 不支持递归查询。可以通过 recursive calls to a stored procedure 模拟递归查询,但这是 hackish 和次优的。

          other ways to organise your data,这些结构允许非常高效的查询。

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 2011-05-24
              • 2023-03-30
              • 1970-01-01
              • 2012-03-27
              • 1970-01-01
              • 1970-01-01
              • 2023-03-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多