Mysql 使用JOIN删除行

Mysql 使用JOIN删除行,mysql,sql,Mysql,Sql,我有两张桌子,看起来像: 离线对话 信息 在这里,UserID 100从messages表中sentBy确定的用户200和300接收到3条消息 我想做的是删除offlineconversations中的所有行,其中消息由id为200的用户发送,因此sentBy 200在消息中。offlineconversations表中的messageID与messages中的messageID相关联,那么offlineconversations将只剩下: userID | messageID 100

我有两张桌子,看起来像:

离线对话

信息

在这里,UserID 100从messages表中sentBy确定的用户200和300接收到3条消息

我想做的是删除offlineconversations中的所有行,其中消息由id为200的用户发送,因此sentBy 200在消息中。offlineconversations表中的messageID与messages中的messageID相关联,那么offlineconversations将只剩下:

userID | messageID
100      17
因此,基本上,从离线对话中删除userID为100且sentBy 200与之关联的行

convID用于历史记录方面。如果有人停用了他的帐户,则不应删除邮件中的行。如果用户完全删除了他的帐户,那么这些行也应该从脱机对话和消息中删除。正如有人在评论中指出的那样,我知道我可以通过级联来实现这一点

谢谢

那么:

    delete from offlineconversations where messageID in (select messageId from 
messages where sentBy = 200)
那么:

    delete from offlineconversations where messageID in (select messageId from 
messages where sentBy = 200)

此查询应适用于以下情况:

 DELETE t.* 
 FROM offlineconversations t 
 JOIN messages m 
 ON m.messageID = t.messageID 
 WHERE m.sentBy = 200 AND t.userID = 100;
如果还需要删除邮件,请执行以下操作:

 DELETE t.*,m.* 
 FROM offlineconversations t 
 JOIN messages m 
 ON m.messageID = t.messageID 
 WHERE m.sentBy = 200 AND t.userID=100;

此查询应适用于以下情况:

 DELETE t.* 
 FROM offlineconversations t 
 JOIN messages m 
 ON m.messageID = t.messageID 
 WHERE m.sentBy = 200 AND t.userID = 100;
如果还需要删除邮件,请执行以下操作:

 DELETE t.*,m.* 
 FROM offlineconversations t 
 JOIN messages m 
 ON m.messageID = t.messageID 
 WHERE m.sentBy = 200 AND t.userID=100;


假设这两个表之间存在外键关系?级联删除可以解决这个问题,例如,在邮件中删除15/200也会在脱机对话中删除100/15。问题是我不想从邮件中删除实际的邮件,因为如果联系人决定再次成为朋友,我会将其用于历史记录。但是如果从脱机对话中删除100/15,您如何将该消息与用户100重新关联?一旦100/15消失,将不再有收件人连接到Message 15,也无法知道它最初发送给谁。这意味着你正在使用ID。这是重复使用IDs是个坏主意的原因之一。一个新帐户应该获得一个新的ID,那么这个问题就没有意义了。但是为什么你需要在停用时更改/删除消息中的任何内容呢?假设用户表中只有一个标志字段,例如deactivated=1。没有删除或任何事情,只是一个简单的更新0=>1。假设这两个表之间有外键关系?级联删除可以解决这个问题,例如,在邮件中删除15/200也会在脱机对话中删除100/15。问题是我不想从邮件中删除实际的邮件,因为如果联系人决定再次成为朋友,我会将其用于历史记录。但是如果从脱机对话中删除100/15,您如何将该消息与用户100重新关联?一旦100/15消失,将不再有收件人连接到Message 15,也无法知道它最初发送给谁。这意味着你正在使用ID。这是重复使用IDs是个坏主意的原因之一。一个新帐户应该获得一个新的ID,那么这个问题就没有意义了。但是为什么你需要在停用时更改/删除消息中的任何内容呢?假设用户表中只有一个标志字段,例如deactivated=1。没有删除或任何事情,只是一个简单的更新0=>1。假设用户200也发送给用户101、102、103等。它不会也删除与这些其他联系人相关联的行吗?您需要外键来执行此操作,或者删除t.*,m.*。。。或者甚至DELETE*您的查询是否删除了发送给任何人的所有行,而不仅仅是两个表中的用户100和用户200?不仅在脱机对话中,如果您都想要,请写DELETE*呃,当我写“基本”语句时,我犯了一个错误,我应该说:所以基本上,从脱机对话中删除用户ID为100且sentBy 200与之关联的行。假设用户200也发送给用户101、102、103等。它不会同时删除与这些其他联系人关联的行吗?您需要外键,或者删除t.*,m.*。。。或者甚至DELETE*您的查询是否删除了发送给任何人的所有行,而不仅仅是两个表中的用户100和用户200?不仅在脱机对话中,如果您都想要,请写DELETE*呃,当我写“基本”语句时,我犯了一个错误,我应该说:所以基本上,从离线对话中删除userID为100且sentBy 200与之关联的行。