当前位置:  开发笔记 > 编程语言 > 正文

删除加入MySQL

如何解决《删除加入MySQL》经验,为你挑选了8个好方法。

这是创建表的脚本:

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;

该职位表没有外键client_id,唯一的project_id.我想删除已通过的项目中的帖子client_id.

现在这不起作用,因为没有删除任何帖子.



1> Yehosef..:

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

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

编辑:有关更多信息,您可以看到这个替代答案


应该注意的是,这是正确的答案,因为联接会强制您使用"DELETE posts FROM posts"而不是正常的"DELETE FROM posts",因为要删除的表不再是明确的.谢谢!
["如果你声明一个表的别名,你必须在引用表时使用别名"](http://dev.mysql.com/doc/refman/5.5/en/delete.html),如此`DELETE d FROM帖子AS d JOIN项目AS p ON ...`
实际上,您可以为连接表使用别名,但不能为主表(帖子)使用别名."DELETE帖子来自帖子INNER JOIN项目p ON p.project_id = posts.project_id"
这是最好的答案,因为你甚至可以在一个动作中删除两个表`DELETE帖子,项目FROM帖子INNER JOIN项目ON projects.project_id = posts.project_id WHERE projects.client_id =:client_id`
注意你不能在这里使用'as'方法,例如p.project_id上的内连接项目为p ...

2> Pacerier..:

由于您要选择多个表,因此要删除的表不再明确.你需要选择:

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等的贡献.


CAPS关键词并不明显.他们正在准备好查询;)
要添加到大写/无大写讨论,是的,您可以使用您喜欢的任何一种风格,但在您的答案中,您实际上是在方便的地方混合样式 - "ON"是大写的.对于经验不足的开发人员来说,它可能表明在风格方面可能会变得混乱和不一致.
如果您正在做出更好的答案 - 至少可以使SQL更具可读性.此问题中的所有其他SQL引用都有大写关键字(除了0票之一).我不确定你为什么还原我的编辑.
@Yehosef,有一群人发现CAPS真的很刺眼.我相信我不是唯一一个,我见过很多人也会采用小写风格.

3> ivanhoe..:

或者同样的事情,略有不同(IMO友好)的语法:

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

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


@ bigtex777:请注意,SELECT语句中的关键字USING与DELETE语句中的相同关键字几乎没有关系.在SELECT中,它指定要连接的列的列表,而在DELETE中,它是连接中所有表的列表

4> 小智..:

您也可以像这样使用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



5> yukondude..:

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

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


你应该真的避免在SQL中使用IN关键字(即使它对初学者来说通常更容易理解)并使用JOIN代替(如果可能),因为子查询通常会使事情变慢.
当子查询返回大量行时,这会导致数据库崩溃.它也非常慢.
我来到这个页面的原因是因为我用IN语句写的查询是狗慢.绝对避免接受这里接受的答案.
与这个问题一样古老,重要的是要知道为什么要使用JOIN而不是IN.当条件在一行上运行时,它将在IN内运行该查询.这意味着,如果需要针对该WHERE检查100行,则该子查询将运行100次.而JOIN只会运行ONCE.因此,随着您的数据库越来越大,该查询将需要更长时间才能完成.@markus只是因为某些事情并不重要并不意味着你应该编写错误的代码.写得好一点将为您节省大量时间和未来的头痛.:)
@yukondude确实"IN"比第一次"JOIN"容易理解,这就是为什么那些不熟悉SQL的人最终会在任何地方写"IN",而他们可以使用"JOIN"表现更好(或者更好的,更多,取决于查询).我记得几年前,几乎所有的SQL查询都会被真正知道如何编写好查询的人重写.这就是为什么我添加评论以避免"IN",以便人们知道如果可能的话,他们应该避免使用它.

6> Aman Garg..:

MySQL使用JOIN删除记录

通常在SELECT语句中使用INNER JOIN从表中选择具有其他表中相应记录的记录.我们还可以使用带有DELETE语句的INNER JOIN子句来删除表中的记录以及其他表中的相应记录,例如,要删除满足特定条件的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中的哪些记录.



7> 1000111..:

单表删除:

要从posts表中删除条目:

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



8> Sangeetha Na..:

尝试如下:

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

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有