Mysql 如何在UPDATE语句中联接两个表?

Mysql 如何在UPDATE语句中联接两个表?,mysql,sql,Mysql,Sql,考虑下表:“用户”和“推文” 我想更新“tweets”表,将暂停用户发出的所有tweets标记为垃圾邮件。因此,在上面的示例中,通过将“spam”值从0更新为1,tweet_id为1、2、4和6的tweet将被标记为spam 我很难把这两张桌子合在一起。到目前为止,我只需要加入SELECT语句,但这似乎更麻烦: UPDATE tweets SET spam = 1 WHERE tweets.user_id = users.user_id AND users.name = 'SUSPENDED'

考虑下表:“用户”和“推文”

我想更新“tweets”表,将暂停用户发出的所有tweets标记为垃圾邮件。因此,在上面的示例中,通过将“spam”值从0更新为1,tweet_id为1、2、4和6的tweet将被标记为spam

我很难把这两张桌子合在一起。到目前为止,我只需要加入SELECT语句,但这似乎更麻烦:

UPDATE tweets SET spam = 1 WHERE tweets.user_id = users.user_id 
AND users.name = 'SUSPENDED'

这肯定不起作用……谁能给我指出正确的方向?

您走的方向是正确的,但您需要在表之间指定一个连接:

UPDATE tweets JOIN users ON tweets.user_id = users.user_id
  SET tweets.spam = 1
WHERE users.name = 'SUSPENDED'
这应该做到:

UPDATE tweets
INNER JOIN users ON (users.user_id = tweets.user_id)
SET spam=1
WHERE users.name='SUSPENDED'

通常,您可以在
更新中使用与在
选择中相同的
加入
。在
更新中,您将无法将一个表连接到它本身,并且还有一些其他的小怪癖,但是对于像这样的基本内容,它将如您所期望的那样工作。

在验证您使用的服务器类型之前开始回答。我知道这在MS SQL Server中有效。然而,我不确定MySQL。没有安装MySQL,请尝试一下

UPDATE tweets SET
  spam = 1
FROM tweets INNER JOIN users ON users.user_id = tweets.user_id
WHERE users.name = 'SUSPENDED'

假设您有3个表,需要将一个
表中的一列更新为另一个
表中的一列。有几种方法可以做到这一点。
例如,请查看此
查询

update Table1 T1, Table2 T2, Table3 T3 set T1.field_name = T3.field_name where (T1.field_name = T2.field_user_name) and (T2.field_id = T3.entity_id);

必须小心维护
表之间的关系。

谢谢!如果我想查看所有被暂停账户的推文?我正在尝试选择tweets.tweet加入tweets上的用户。user\u id=users.user\u id WHERE users.name='SUSPENDED',但我收到一个错误?“连接时检查错误”。SELECT语句不也是这样吗?@Reveller你忘记了你的
从推文中选择推文加入推文用户。user\u id=users.user\u id WHERE users.name='SUSPENDED'
@Michael Berkowski我尝试过这种查询。但当记录达到30k边界时,服务器停止。还有其他解决方案吗?@BhavinChauhan您可能在连接的列上没有索引。确保它们都有索引或外键关系。@Michael Berkowski是的,谢谢你的评论,我试着添加主键,效果很好:)测试了50万条记录。
update Table1 T1, Table2 T2, Table3 T3 set T1.field_name = T3.field_name where (T1.field_name = T2.field_user_name) and (T2.field_id = T3.entity_id);