2010-07-08 111 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