php - 在嵌套循环中运行查询

标签 php mysql codeigniter

在解释代码之前我必须解释数据结构

所以我有这种格式的数据

=>Department
==>Category
===>Sub-Category

有多个部门有多个类别,这些类别有子类别。

可以有多个类别同名不同部门,子类别和类别相同。

有一个包含所有数据和产品的表格。我必须以适当的方式提取数据并放入

Departments 
Categories => fk is Departments id
Subcategories => fk is Categories id

首先我在部门中插入数据

然后在类别中,首先我得到了部门的 ID,然后插入到类别表中:

public function insertDataInCategory($data)
{   
    if(!empty($data)){
        //pass data from hierarchy
        foreach ($data as $dkey => $drow) {
            //get id
            $this->db->select('id');
            $this->db->from('departments');
            $this->db->WHERE('name',$dkey);
            $query = $this->db->get();
            //getting department it to identify category  
            $did = $query->result_array(); 

            //adding category from department
            foreach ($drow as $ckey => $crow) {
                $cat_content = array(
                   'department_id' => $did[0]['id'] ,
                   'name' => $ckey ,
                   'description' => ''
                );
                $this->db->insert('categories', $cat_content);
            }
        }
    }
}

在子类别中,首先我必须获取类别的部门 ID,然后我确定该子类别属于该类别。 因此,此处运行的 3 个查询正在增加执行时间。

public function insertDataInSubcategory($data)
{   
    //pass data from hierarchy
    if(!empty($data)){
        //department foreach
        foreach ($data as $dkey => $drow) {
            //category each
            $this->db->select('id');
            $this->db->from('departments');
            $this->db->WHERE('name',$dkey);
            $query = $this->db->get();
            //getting department it to identify category
            $did = $query->result(); 
            foreach ($drow as $ckey => $crow) {
                //get id
                $this->db->select('id');
                $this->db->from('categories');
                $this->db->WHERE('name',$ckey);
                $this->db->WHERE('department_id',$did[0]->id);
                $query = $this->db->get();
                //getting id of category of sub-category 
                $cid = $query->result_array(); 
                //sub-category foreach
                foreach ($crow as $skey => $srow) {
                    $scat_content = array(
                       'category_id' => $cid[0]['id'] ,
                       'name' => $skey ,
                       'description' => ''
                    );
                    $this->db->insert('sub_categories', $scat_content);
                }       
            }
        }
    }
}

insertDataInCategory 和insertDataInSubcategory 函数的使用时间急剧增加。请告诉我如何减少它的时间。以及插入表格的正确方法

最佳答案

问题是您多次运行查询,这会增加执行时间。运行单个查询将减少您的时间。

试试这个代码:

public function insertDataInCategory($data)
{   
    if(!empty($data)){
        //pass data from hierarchy
        foreach ($data as $dkey => $drow) {
            //get id
            //adding category from department
            foreach ($drow as $ckey => $crow) {
                   $query = "INSERT INTO categories ";
                   $query.= "(department_id, name , description)";
                   $query.= "VALUES ((SELECT id FROM departments WHERE name = '$dkey') , '$ckey' , '')";
                   $this->db->query($query);
            }
        }
    }
}

public function insertDataInSubcategory($data)
{   
    //pass data from hierarchy
    if(!empty($data)){
        //department foreach
        foreach ($data as $dkey => $drow) {
            foreach ($drow as $ckey => $crow) {
                //sub-category foreach
                foreach ($crow as $skey => $srow) {
                   $query = "INSERT INTO sub_categories ";
                   $query.= "(category_id , name , description)";
                   $query.= "VALUES ((SELECT id FROM categories WHERE name = '$ckey' && department_id = (SELECT id FROM departments WHERE name = '$dkey')) , '$skey' , '')";
                   $this->db->query($query);
                }       
            }
        }
    }
}

现在只设置了一个连接,它会更快地插入记录。

关于php - 在嵌套循环中运行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46989879/

相关文章:

mysql - 复杂连接 1 个结果 2 个相同连接

javascript - JQuery 验证数据存在于带有空格的表中

php - CodeIgniter/PHP Active Record 不会递增整数

php - 最佳实践 : What's the Best Way for Constructing Headers and Footers?

php数组动态填充

java - XSLT 处理巨大的 XML 文件(几乎 5 GB)

php - 如何检查表单并使用帖子值自动重定向到 Paypal ?

php - 如何动态传递if语句的条件

mysql - MySQL 中的元表

mysql - 当您认识 parent 时如何搜索特定的 child ?