使用LEFT JOIN从数据库中删除条目

时间:2014-01-08 21:18:27

标签: php mysql sql

我找不到合适的sql语句

我有3张桌子:

1.) Messages
2.) Mail_Inbox
3.) Mail_Outbox

新消息存储在消息中,其ID存储在其他表中。 用户可以从收件箱和发件箱文件夹中删除邮件。

我想要解析一个单独的sql语句来删除“消息”中的所有条目,其中Inbox和Outbox中没有相应ID的条目。

我仍然找到了一个工作语句,告诉我正确的ID,但我找不到删除它们的方法。

SELECT Messages.Message_ID 
FROM `Messages` 
LEFT JOIN Mail_Inbox On Messages.Message_ID = Mail_Inbox.Message_ID 
LEFT JOIN Mail_Outbox On Messages.Message_ID = Mail_Outbox.Message_ID 
WHERE ISNULL(Mail_Outbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID)

我试过了:

DELETE FROM Messages 
WHERE Message_ID = (SELECT Messages.Message_ID 
                    FROM `Messages` 
                    LEFT JOIN Mail_Inbox On Messages.Message_ID = Mail_Inbox.Message_ID 
                    LEFT JOIN Mail_Outbox On Messages.Message_ID = Mail_Outbox.Message_ID 
                    WHERE ISNULL(Mail_Outbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID))

但是出现了这个错误:您无法在FROM子句

中指定要更新的目标表'Messages'

: - (

2 个答案:

答案 0 :(得分:1)

根据{{​​3}},无法使用要从子查询中删除的表 - 文档

SELECT
  Messages.Message_ID
FROM `Messages`
  LEFT JOIN Mail_Inbox ON Messages.Message_ID = Mail_Inbox.Message_ID
  LEFT JOIN Mail_Outbox ON Messages.Message_ID = Mail_Outbox.Message_ID
WHERE ISNULL(Mail_Inbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID)

变为

DELETE
  Messages
FROM `Messages`
  LEFT JOIN Mail_Inbox ON Messages.Message_ID = Mail_Inbox.Message_ID
  LEFT JOIN Mail_Outbox ON Messages.Message_ID = Mail_Outbox.Message_ID
WHERE ISNULL(Mail_Inbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID)

答案 1 :(得分:-2)

DELETE FROM Messages WHERE Message_ID IN (some subquery that select Message_IDs)

您当前的子查询将为您提供所有Message_ID,并将删除所有邮件,因为您使用LEFT JOIN。使用INNER JOIN。