代码之家  ›  专栏  ›  技术社区  ›  mangrove108

如何优化从多个表(到一个表)中删除查询?

  •  0
  • mangrove108  · 技术社区  · 6 年前

    好的,我目前正在从多个表中成功删除,其中有三个查询选择了类别ID所在的行,除了一个,我使用子查询按类别ID获取日志ID。如何以更高效和更全面的方式进行删除?谢谢!

    /**
     * delete category by id
     * @param $id
     * @return bool
     */
    public function delete_category($id){
    
        $this->db->query("DELETE FROM categories WHERE categories.id = $id");
        $this->db->query("DELETE FROM comments
                          WHERE comments.post_id = ANY (SELECT post_id
                                                        FROM posts
                                                        WHERE category_id = $id)");
        $this->db->query("DELETE FROM posts
                          WHERE posts.category_id = $id
                          AND posts.category_id IS NOT NULL");
    }
    

    代码工作得很好,它给出了期望的结果,但看起来有点粗糙,我如何优化它呢?

    1 回复  |  直到 6 年前
        1
  •  0
  •   AndreKR    6 年前

    MySQL有一个 multi-table DELETE syntax .

    实际上,您需要一个选择查询来选择要删除的行,然后更改 SELECT * FROM DELETE <table_name>, <table_name> FROM <table_name>, <table_name> 是要从中删除的表。

    例如,如果您有这些删除查询:

    DELETE FROM comments WHERE post_id IN (SELECT post_id FROM posts WHERE category_id = 1);
    DELETE FROM posts WHERE category_id = 1;
    DELETE FROM categories WHERE category_id = 1;
    

    您可以将它们重写为选择要删除的所有行的选择:

    SELECT *
    FROM categories
    JOIN posts USING (category_id)
    JOIN comments USING (post_id)
    WHERE category_id = 1
    

    然后你可以替换 SELECT 有多张桌子 DELETE :

    DELETE categories, posts, comments
    FROM categories
    JOIN posts USING (category_id)
    JOIN comments USING (post_id)
    WHERE category_id = 1