下面是创建我的表的脚本:

CREATE TABLE clients (
   client_i 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表没有外键client_id,只有project_id。我想删除具有传递client_id的项目中的帖子。

这是不工作的,因为没有帖子被删除。


当前回答

试试下面的方法:

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

其他回答

由于您正在选择多个表,要删除的表不再是明确的。您需要选择:

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

在这种情况下,table_name1和table_name2是同一个表,所以这样可以工作:

DELETE projects FROM posts INNER JOIN [...]

你甚至可以删除这两个表,如果你想:

DELETE posts, projects FROM posts INNER JOIN [...]

注意,order by和limit不适用于多表删除。

还要注意,如果你为一个表声明了别名,那么在引用该表时必须使用别名:

DELETE p FROM posts as p INNER JOIN [...]

来自Carpetsmoker等的贡献。

试试下面的方法:

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

一种解决方案是使用子查询

DELETE FROM posts WHERE post_id in (SELECT post_id FROM posts p
INNER JOIN projects prj ON p.project_id = prj.project_id 
INNER JOIN clients c on prj.client_id = c.client_id WHERE c.client_id = :client_id 
);

子查询返回需要删除的ID;所有三个表都使用连接连接,只有那些符合过滤条件的记录被删除(在你的例子中,即where子句中的client_id)。

你也可以像这样使用别名,它只是在我的数据库上使用它!T是需要删除的表!

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

我更习惯这个子查询解决方案,但我没有在MySQL中尝试过:

DELETE  FROM posts
WHERE   project_id IN (
            SELECT  project_id
            FROM    projects
            WHERE   client_id = :client_id
        );