【问题标题】:MySQL - Update column values using subquery select itselfMySQL - 使用子查询选择自身更新列值
【发布时间】:2014-10-07 08:03:13
【问题描述】:

请帮助我更新 MySQL 以使用 select 本身的结果返回来更新列。

例如,我有两张桌子

表用户( 用户 ID 整数, groupid 整数 )

TABLE 线程 ( threadid int, 用户 ID 整数, 粘性微小, 贵宾小号 )

现在我正在尝试通过单个更新查询来实现这一点,但似乎无法做到。我认为我应该做的是:

UPDATE user SET groupid=15 WHERE userid IN (SELECT userid FROM thread t LEFT JOIN user u ON u.userid=t.userid WHERE (t.sticky=1 AND t.vip=1) AND (u.groupid=11 OR u.groupid=14) GROUP BY t.userid);

但是 MySQL 说:#1093 - 您不能在 FROM 子句中指定目标表 'user' 进行更新

请帮帮我!

【问题讨论】:

  • 一般来说,在没有任何聚合函数的情况下,使用 GROUP BY 子句是个坏主意。 MySQL 可以原谅(甚至优化)这种异常,但它通常会导致意外或错误的结果。此外,除非您包含 IS NULL 比较,否则在您不选择任何列的表上的 LEFT JOIN 只是很奇怪!
  • GROUP BY 因为结果返回了重复的用户 ID。我怎样才能解决这个问题,只用一个查询?

标签: mysql


【解决方案1】:

可以通过两个表的左连接生成一个新表,然后从过滤结果更新,语法如下:

UPDATE user AS nu 
 INNER JOIN
  (SELECT u.userid, u.groupid 
  FROM thread t LEFT JOIN user u 
      ON u.userid=t.userid 
  WHERE (t.sticky=1 AND t.vip=1) AND 
       (u.groupid=11 OR u.groupid=14) 
  GROUP BY t.userid) AS my_table
 ON nu.userid = my_table.userid 
SET nu.groupid = 15;

【讨论】:

  • 感谢您的回复。但错误返回:#1288 - UPDATE 的目标表 my_table 不可更新
  • @hatxi:现在它应该可以工作了,在之前的情况下,一个新表 my_table 已经形成,它只是左连接结果的一个临时表。
  • 谢谢 Rockse,它返回错误:#1052 - 字段列表中的列 'userid' 不明确
  • 仍然报错:#1054 - 'on Clause' 中的未知列 'u.userid'
  • 请添加一个sqlfiddle,它是一些很容易解决的愚蠢的语法错误。
【解决方案2】:

尝试使用以下方法:

UPDATE user u2 SET u2.groupid=15 WHERE u2.userid IN (SELECT userid FROM thread t LEFT JOIN user u ON u.userid=t.userid WHERE (t.sticky=1 AND t.vip=1) AND (u.groupid=11 OR u.groupid=14) GROUP BY t.userid);

这应该可以解决问题,希望对您有所帮助:)

【讨论】:

  • #1093 - 您不能在 FROM 子句中指定目标表 'u2' 进行更新 :(
  • 很抱歉听到这个消息,我会做一些研究并改变我的答案
【解决方案3】:
update user1 u
left join thread1 t on t.userid = u.userid
where (t.sticky=1 AND t.vip=1) AND (u.groupid=11 OR u.groupid=14) 
set u.groupid = 15
GROUP BY t.userid;

Use this

【讨论】:

    【解决方案4】:

    您想要的查询是否与此有实质性不同...

    UPDATE user u
      JOIN thread t 
        ON t.userid = u.userid 
       SET groupid = 15
     WHERE t.sticky = 1 
       AND t.vip = 1
       AND u.groupid IN(11,14);
    

    ?

    如果是这样,那么按照 Rockse 的建议,考虑提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题以及相应的所需结果集。

    【讨论】:

      【解决方案5】:

      您可以在查询之前添加:

      use yourdatabase;
      

      yourdatabase 是包含用户表的数据库名称

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        相关资源
        最近更新 更多