MySQL - 使用子查询选择自身更新列值

时间:2014-10-07 08:03:13

标签: mysql

请帮助我使用MySQL更新来更新列,并从select本身返回结果。

例如,我有两张桌子

  

TABLE用户(     userid int,     groupid int   )

     

TABLE线程(     threadid int,     userid int,     粘性tinyint,     vip tinyint   )

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

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子句中的更新

请帮助我!

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

尝试使用以下内容:

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

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

答案 2 :(得分:0)

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

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),以便我们可以更容易地复制问题,以及相应的期望结果集。

答案 3 :(得分:0)

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 :(得分:-1)

您可以在查询之前添加:

use yourdatabase;

yourdatabase是数据库名称,包括用户表