6

Удаление с использованием JOIN в MySQL

13

У меня возникла проблема с удалением записей из таблицы posts в базе данных. У меня есть следующие таблицы:

CREATE TABLE clients (
   client_id INT(11),
   PRIMARY KEY (client_id)
);
CREATE TABLE projects (
   project_id INT(11) UNSIGNED,
   client_id INT(11) UNSIGNED,
   PRIMARY KEY (project_id)
);
CREATE TABLE posts (
   post_id INT(11) UNSIGNED,
   project_id INT(11) UNSIGNED,
   PRIMARY KEY (post_id)
);

В своем PHP-коде я пытаюсь удалить все посты, связанные с проектами, которые относятся к определенному клиенту. Я использую следующий запрос:

DELETE 
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;

Однако данный запрос не работает, и никаких записей из таблицы posts не удаляется. Важно отметить, что в таблице posts нет внешнего ключа client_id, есть только project_id. Я хочу удалить посты в проектах, которые связаны с переданным client_id.

Как исправить запрос, чтобы он правильно удалял записи из таблицы posts?

5 ответ(ов)

0

Вы также можете использовать ALIAS таким образом, это работает, я только что использовал это в своей базе данных! t — это таблица, из которой нужно удалить записи!

DELETE t FROM posts t
INNER JOIN projects p ON t.project_id = p.project_id
AND t.client_id = p.client_id

Этот запрос удаляет записи из таблицы posts, основываясь на условии соединения с таблицей projects. Убедитесь, что используете правильные идентификаторы и условия для вашего конкретного случая.

0

Для выполнения похожей задачи с несколько другим (на мой взгляд, более удобным) синтаксисом можно использовать следующий запрос:

DELETE posts 
FROM posts 
JOIN projects ON projects.project_id = posts.project_id 
WHERE projects.client_id = :client_id;

Обратите внимание, что в MySQL использование JOIN, как правило, быстрее, чем использование подзапросов. Это связано с тем, что JOIN позволяет серверу базы данных оптимизировать выполнение запроса, работая с таблицами напрямую.

0

Судя по вашему запросу, вы хотите удалить записи из таблицы posts, основываясь на результатах подзапроса из таблицы projects. В MySQL можно использовать подзапрос в операторе DELETE, и ваш пример выглядит вполне корректно. Однако, стоит отметить, что в некоторых версиях MySQL подзапросы в операциях DELETE могут вести себя не так, как ожидается. Ваша структура запроса действительно рабочая, но если вы хотите убедиться, что он выполнится без ошибок, вы можете попробовать использовать присоединение вместо подзапроса. Вот пример, как это можно сделать:

DELETE p
FROM posts p
JOIN projects pr ON p.project_id = pr.project_id
WHERE pr.client_id = :client_id;

Такой подход может быть более эффективным, особенно если у вас большие таблицы. Не забудьте заменить :client_id на ваш фактический идентификатор клиента.

0

Для удаления записей из таблицы posts вы можете использовать следующий SQL-запрос:

DELETE ps 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

Если вам нужно удалить записи из таблицы projects, используйте такой запрос:

DELETE pj 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

А чтобы удалить записи из таблицы clients, выполните следующий запрос:

DELETE C
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

Если вы хотите удалить записи из нескольких таблиц, указанных в объединении, вам нужно указать названия таблиц после DELETE через запятую. Например, если вы хотите удалить записи из всех трех таблиц (posts, projects, clients) для определенного клиента, используйте следующий запрос:

DELETE C, pj, ps 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

Такой подход позволяет вам эффективно удалять записи из связанных таблиц, используя условия, зависящие от сторонних таблиц.

0

Чтобы удалить записи в MySQL с использованием JOIN, вы можете применить оператор INNER JOIN в операторе DELETE. Это позволяет удалять записи из одной таблицы и связанные с ними записи из другой таблицы. Например, чтобы удалить записи из таблиц T1 и T2, которые соответствуют определенному условию, вам нужно использовать следующий запрос:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition

Обратите внимание, что имена таблиц T1 и T2 указаны между DELETE и FROM. Если вы не укажете таблицу T1, оператор DELETE удалит только записи из таблицы T2, и наоборот: если не указать T2, будут удалены только записи из T1.

Условие соединения T1.key = T2.key определяет соответствующие записи в таблице T2, которые нужно удалить. Условие в WHERE-клауза указывает, какие именно записи в T1 и T2 должны быть удалены.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь