【问题标题】:How to join two tables in an UPDATE statement?如何在 UPDATE 语句中连接两个表?
【发布时间】:2012-03-31 15:25:52
【问题描述】:

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

user_id name             tweet_id user_id tweet        spam
-----------------        ----------------------------------
1       SUSPENDED        1        1       lorem ipsum  0
2       foo              2        1       dolor        0
3       bar              3        2       samet        0
4       SUSPENDED        4        1       stunitas     0
                         5        3       hello        0
                         6        4       spamzz!      0

我想更新“tweets”表,将被暂停的用户发布的所有推文标记为垃圾邮件。所以在上面的例子中,tweet_id 为 1、2、4 和 6 的推文将通过将“垃圾邮件”值从 0 更新为 1 来标记为垃圾邮件。

我无法连接这两个表。到目前为止,我只需要加入 SELECT 语句,但这似乎更麻烦:

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

这肯定行不通...谁能指出我正确的方向?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您在正确的轨道上,但您需要在表格之间指定 JOIN

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

    【讨论】:

    • 谢谢!如果我只想查看暂停帐户发布的所有推文?我正在尝试 SELECT tweets.tweet JOIN users ON tweets.user_id = users.user_id WHERE users.name = 'SUSPENDED' 但出现错误? “在 JOIN 时检查错误”。 SELECT 语句不是同样的约定吗?
    • @Reveller 你忘了你的FROMSELECT tweet FROM tweets JOIN users ON tweets.user_id = users.user_id WHERE users.name = 'SUSPENDED'
    • @Michael Berkowski 我已经尝试过这种类型的查询。但是当记录达到 30k 边界服务器停止。还有其他解决办法吗?
    • @BhavinChauhan 您可能在连接的列上没有索引。确保它们都有索引或存在外键关系。
    • @Michael Berkowski 是的,感谢您的评论,我已经尝试添加主键,它就像魔术一样工作:) 测试了 50 万条记录。
    【解决方案2】:

    应该这样做:

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

    您通常可以像在SELECT 中一样在UPDATE 中使用JOIN。您将无法在 UPDATE 中将一个表加入到自身中,并且还有一些其他小怪癖,但对于像这样的基本内容,它会按您的预期工作。

    【讨论】:

      【解决方案3】:

      在验证您使用的服务器类型之前开始回答。我知道这适用于 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'
      

      【讨论】:

        【解决方案4】:

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

        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);
        

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

        【讨论】:

          猜你喜欢
          • 2021-02-14
          • 2016-11-22
          • 2019-02-23
          • 2015-11-29
          • 1970-01-01
          • 1970-01-01
          • 2019-05-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多