Как оптимизировать запросы на удаление из (для) нескольких таблиц (в одну)? - PullRequest
0 голосов
/ 10 февраля 2019

хорошо, в настоящее время я успешно удаляю из нескольких таблиц с тремя запросами, выбирая строку, где присутствует category_id, кроме одного, там я использую подзапрос, чтобы получить post_id по category_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 Ответ

0 голосов
/ 10 февраля 2019

MySQL имеет многотабличный синтаксис DELETE .

По сути, вы берете запрос SELECT, который выбирает строки, которые вы хотите удалить, и вы изменяете SELECT * FROM на DELETE <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
...