2010-07-08 110 views
3

我正在寻找删除基于ID的1个查询中两个不同表中的信息。MySQL从2个表中删除记录

我已经在这里尝试了几个解决方案来完成这项任务,但仍然没有完成我想要做的事情。

表1 - 内容

---------- --------- 
ContentID | Content 
-------------------- 

表2 - 投票

--------------------------- 
VoteID | ContentID | Vote 
--------------------------- 

我想基于其ID和任何或所有选票删除内容行(可能有0票的记录)。我做不是想要使用事务,级联删除或使用2个不同的查询。

什么是最好的 - 左加入?内部联接?

在这里的任何帮助将不胜感激。

+0

参见[MySQL的DELETE语法] (http://dev.mysql.com/doc/refman/5.1/en/delete.html)并查找*多表DELETE *。 – Mike 2010-07-08 15:34:25

+0

MySQL支持多表删除,但标准SQL只允许从每个语句的一个表中删除。如果您打算将此端口移植到其他数据库,则必须重新编写它。 – 2010-07-08 16:32:10

回答

7
DELETE Content, Votes 
FROM Content 
LEFT JOIN Votes 
ON Votes.ContentID = Content.ContentID 
WHERE Content.ContentID = ? 
1
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

尽管这是3张表格,但我相信您可以根据自己的需求进行调整。

2

如果你有一个关系,你可以试试ON DELETE CASCADE选项。

另一种选择是创建一个存储过程,并在两个步骤中执行删除操作,但只有一个服务器调用。

+2

我不认为这满足*“我不想使用事务,级联删除或使用2个不同的查询”*子句;-) – Mike 2010-07-08 15:40:12

+0

也许只有存储的过程安全部分,如果担心只有一台服务器请求......我承认我跳过了答案的“必备条件”部分;) – munissor 2010-07-08 15:55:29

1

您可以在DELETE语句中指定多个表,以根据WHERE子句中的特定条件从一个或多个表中删除行。但是,您不能在多表DELETE中使用ORDER BY或LIMIT。 table_references子句列出了连接中涉及的表。其语法在第12.2.7.1节“JOIN语法”中介绍。

从MySQL 4.0.0开始支持第一个多表DELETE语法。第二个从MySQL 4.0.2开始支持。

对于第一个多表语法,只删除FROM子句之前列出的表中匹配的行。对于第二个多表语法,只删除FROM子句(USING子句之前)中列出的表中的匹配行。其效果是,您可以同时从多个表中删除行并具有仅用于搜索的附加表:

DELETE t1,t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id = t2。 id和t2.id = t3.id;

或者:

DELETE FROM T1,T2 USING T1 INNER JOIN T2 INNER JOIN T3 WHERE t1.id = t2.id AND t2.id = t3.id;

这些语句在搜索要删除的行时使用全部三个表,但仅从表t1和t2删除匹配的行。

此链接可能是有用的“http://dev.mysql.com/doc/refman/4.1/en/delete.html

+0

那么我的WHERE子句是什么? contentId存在于内容表中,但也可能存在或不存在于投票表1或更多次。 – barfoon 2010-07-08 15:49:17

+1

DELETE内容,投票FROM内容INNER JOIN投票其中Content.ContentID = Votes.ContentID并“应用您的条件” – user386660 2010-07-08 16:17:24

+0

@dilipchouhan:如果在投票中找不到匹配的行,内部联接将阻止内容记录被删除。它应该是一个左连接:'DELETE Con​​tent,Votes FROM Content LEFT JOIN Votes ON Votes.ContentID = Content.ContentID WHERE Con​​tent.ContentID =?' – Mike 2010-07-08 16:21:49

0

不使用“连接”最简单的,我可以拿出当我寻找解决的办法是DELETE a.*,b.* FROM table1 AS a, table2 AS b WHERE a.id = b.id AND a.field = 1