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

标签 mysql codeigniter sql-delete

好吧,我目前正在从多个表中成功删除,其中三个查询选择了存在category_id的行,除了一个之外,我使用子查询通过category_id获取post_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");
}

代码工作正常,给出了期望的结果,但看起来有点恶心,我该如何优化它?

最佳答案

MySQL有一个multi-table DELETE syntax .

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

例如,如果您有以下 DELETE 查询:

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:

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

关于mysql - 如何优化从多个表(到一个表)的删除查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54619472/

相关文章:

mysql - 我应该将 MySQL 数据库转换为 JSON 文件吗?

php - 为什么 mysqli_connect 不能工作而 mysql_connect 可以?

php - 从 MySQL 返回一个 boolean 值以在函数中用作参数

python - 无法在 Access by Python 中删除数据

sql - 如何在 Apache Derby 中删除有限数量的行

mysql - 如何使用 RIDE 连接到 MySQL

mysql - 在 MySQL 中逐行使用 SUM()

php - 如何在 ci 中使用动态添加和删除时内爆文本区域值?

php - codeigniter 从字符串修改数组以进行 insert_batch

mysql - 使用一条命令同步删除多个表中的数据