Удаление с использованием JOIN в MySQL
У меня возникла проблема с удалением записей из таблицы 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 ответ(ов)
Вы также можете использовать 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
. Убедитесь, что используете правильные идентификаторы и условия для вашего конкретного случая.
Для выполнения похожей задачи с несколько другим (на мой взгляд, более удобным) синтаксисом можно использовать следующий запрос:
DELETE posts
FROM posts
JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
Обратите внимание, что в MySQL использование JOIN, как правило, быстрее, чем использование подзапросов. Это связано с тем, что JOIN позволяет серверу базы данных оптимизировать выполнение запроса, работая с таблицами напрямую.
Судя по вашему запросу, вы хотите удалить записи из таблицы 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
на ваш фактический идентификатор клиента.
Для удаления записей из таблицы 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;
Такой подход позволяет вам эффективно удалять записи из связанных таблиц, используя условия, зависящие от сторонних таблиц.
Чтобы удалить записи в 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 должны быть удалены.
SQL: выбрать только строки с максимальным значением в столбце
Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
MySQL Запрос: Группировка по Дню / Месяцу / Году
Как временно отключить ограничение внешнего ключа в MySQL?
Как восстановить дамп-файл из mysqldump?