Php 从多个表中删除

Php 从多个表中删除,php,mysql,codeigniter,Php,Mysql,Codeigniter,因此,我尝试从多个表中删除(在本场景6中)。我尝试使用内部联接在一个查询中删除所有行,但无法使其工作 以下是我讨厌的作品: // Delete course and everything linked to it (topics, badges, dotpoints, questions & answers) $topic = $this->db->query("SELECT * FROM course_topics WHERE cour

因此,我尝试从多个表中删除(在本场景6中)。我尝试使用内部联接在一个查询中删除所有行,但无法使其工作

以下是我讨厌的作品:

        // Delete course and everything linked to it (topics, badges, dotpoints, questions & answers)   
        $topic = $this->db->query("SELECT * FROM course_topics WHERE course_id = ".$row_id);    
        foreach ($topic->result() as $t)
        {
            $badge = $this->db->query("SELECT * FROM course_topic_badges WHERE topic_id = ".$t->id);    
            foreach ($badge->result() as $b)
            {
                $dotpoint = $this->db->query("SELECT * FROM course_topic_dotpoints WHERE badge_id = ".$row_id);
                foreach ($dotpoint->result() as $d)
                {
                    $question = $this->db->query("SELECT * FROM quiz_questions WHERE dotpoint_id = ".$d->id);
                    foreach ($question->result() as $q)
                    {
                        $answer = $this->db->query("SELECT * FROM quiz_answers WHERE question_id = ".$q->id);
                        foreach ($answer as $a)
                        {
                            $this->db->query("DELETE FROM quiz_answers WHERE question_id = ".$q->id);
                        }
                        $this->db->query("DELETE FROM quiz_questions WHERE dotpoint_id = ".$d->id);
                    }
                    $this->db->query("DELETE FROM course_topic_dotpoints WHERE badge_id = ".$b->id);
                }
                $query = $this->db->query("DELETE FROM course_topic_badges WHERE topic_id = ".$t->id);
            }
            $query = $this->db->query("DELETE FROM course_topics WHERE course_id = ".$row_id);
        }
        $query = $this->db->query("DELETE FROM courses WHERE id = ".$row_id);

我如何简化这一点?

您可以简化这一点:

$answer = $this->db->query("SELECT * FROM quiz_answers WHERE question_id = ".$q->id); 
foreach ($answer as $a) 
{ 
    $this->db->query("DELETE FROM quiz_answers WHERE question_id = ".$q->id); 
} 
简单地 $this->db->query(“从问答题答案中删除,其中问题id=”.$q->id)

另一个选项(如果您有权限)是设置外键和“ON DELETE CASCADE”

否则,在不了解数据库结构的情况下,将很难重新获得更多。您可以使用子选择,但仍然需要一些级联


另一种选择是更改数据库结构,使其包含基于多个字段的主键(例如,课程主题点为“主题id、徽章id、点id”)然后你可以一次删除更多,但这可能需要一点修改。

我为自己创建了一个函数,可以从多个表中删除
you need to SET FOREIGN_KEY_CHECKS = 0;
you can read more dev.mysql.com/doc/en/innodb-foreign-key-constraints.html
SET @BACKUP_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS; 
SET @@FOREIGN_KEY_CHECKS=0;

-- Do stuff here

SET @@FOREIGN_KEY_CHECKS=@BACKUP_FOREIGN_KEY_CHECKS;
SET @BACKUP_FOREIGN_KEY_CHECKS=NULL;
给你

    function delete_multiple_rows($table    ,   $condition  ,   $join_condition)
    {
        $table_count    =   count($table);
        $join_count     =   count($join_condition) + 1; 

        if($table_count ==  $join_count)
        {
            if(count($condition)>0)
            {
                $delete_query    =  'DELETE '.  implode(' , ',$table)   .' FROM '.$table[0];

                $counter    =   1;
                foreach($join_condition as $key => $value)
                {
                    $delete_query   .=  ' LEFT JOIN '   .   $table[$counter]    .   ' ON '  .   $key    .   ' = '   .   $value;
                    $counter++;
                }

                $condition_counter  =   1; 

                foreach($condition as $key  => $value)
                {
                    if($condition_counter > 1)
                    {
                        $delete_query   .=  ' AND ';
                    }else{
                        $delete_query   .=  ' WHERE ';
                    }
                    $delete_query   .=  $key    .   ' = '   .   $value;
                    $condition_counter++; 
                }           
                $delete_query;              
                $this->db->query($delete_query);

            }else{
                echo 'This query requires at least 1 where condition.';
            }       
        }else{

            $table_count    =   count($table)   -   1;
            echo 'At least '    .   $table_count    .   ' join conditions must be provided.';
        }
    } 
如何使用

这些是控制器方法参数

$table  =   array('table1','table2','table3');
$condition  =   array('id'=>1,'2nd_condition'=>'blah');
$join_condition =   array(
                    'table1.column' =>  'table2.column',
                    'table1.column' =>  'table3.column'
                    );

这非常有效

您不需要发送查询,而应该在mysql数据库中设置一些触发器

分隔符$
在删除某些表之前创建触发器名称
每行开始 从一些其他表格中删除,其中一些id=NEW.id
结束$

将其放入PHPMYADMIN中的SQL中,它将创建一个名为trigger_Name的触发器(其实并不重要)

每次在某个表上执行delete函数时,它都会使用您拥有的id删除某个其他表中的行


阅读了解更多信息。

您能用英语解释一下“删除”是如何相互关联的吗?否则,如果它们不相关,那么单独的“delete”语句是最好的选择。一些带有级联删除的外键关系将在这里真正帮助您。我将如何确切地更改数据库结构以包含主键?请阅读此处:这可以很好地解释。哇。这让我大开眼界。非常感谢!哇!谢谢我会调查的@不客气,我要说的是,你可以用扳机连锁反应。如果表a的触发器影响表b,表b的触发器影响表c。发送到表a的查询可能会影响表b和c。谢谢你的提醒。