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

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的项目中的帖子。

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


当前回答

你只需要指定你想要从posts表中删除条目:

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

编辑:要了解更多信息,您可以查看这个替代答案

其他回答

你只需要指定你想要从posts表中删除条目:

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

编辑:要了解更多信息,您可以查看这个替代答案

或者是同样的东西,只是语法略有不同(IMO更友好):

DELETE FROM posts 
USING posts, projects 
WHERE projects.project_id = posts.project_id AND projects.client_id = :client_id;

顺便说一句,在mysql中使用连接几乎总是比子查询更快…

MySQL使用JOIN删除记录

通常在SELECT语句中使用INNER 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中的哪些记录。

试试这个,

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

注意,你不能在需要删除的表上使用别名

DELETE tbl_pagos_activos_usuario
FROM tbl_pagos_activos_usuario, tbl_usuarios b, tbl_facturas c
Where tbl_pagos_activos_usuario.usuario=b.cedula
and tbl_pagos_activos_usuario.cod=c.cod
and tbl_pagos_activos_usuario.rif=c.identificador
and tbl_pagos_activos_usuario.usuario=c.pay_for
and tbl_pagos_activos_usuario.nconfppto=c.nconfppto
and NOT ISNULL(tbl_pagos_activos_usuario.nconfppto)
and c.estatus=50