2014-10-07 69 views
0

请帮助我使用MySQL更新来更新带有选择自身的结果返回列。MySQL - 使用子查询选择自身更新列值

举例来说,我有两个表

TABLE user( userid int, groupid int )

TABLE thread ( threadid int, userid int, sticky 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子句

请帮帮我!

+0

通常,在没有任何聚合函数的情况下,GROUP BY子句是一个坏主意。 MySQL会原谅(甚至优化)像差,但它往往会导致意想不到或错误的结果。另外,除非包含IS NULL比较,否则在没有选择列的表上使用LEFT JOIN就显得很奇怪! – Strawberry 2014-10-07 08:06:55

+0

可能重复的[Mysql错误1093 - 无法在FROM子句中指定更新的目标表](http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-从子句中更新) – Juru 2014-10-07 08:07:12

+0

GROUP BY因为结果返回重复的userid。 我如何才能解决问题,只有单个查询? – hatxi 2014-10-07 08:21:06

回答

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; 
+0

感谢您的回复,但错误返回:#1288 - UPDATE的目标表my_table不可更新 – hatxi 2014-10-07 08:35:13

+0

@hatxi:现在应该可以工作了,在早先的情况下,新的表my_table已经形成了,它只是一个临时表,来自左连接的结果。 – 2014-10-07 08:47:17

+0

谢谢Rockse,它返回错误: #1052 - 字段列表中的'userid'列不明确 – hatxi 2014-10-07 08:52:30

-1

您可以在查询之前补充一点:

use yourdatabase; 

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

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

这应该做的伎俩,希望它帮助:)

+0

#1093 - 您无法在FROM子句中指定目标表'u2'进行更新:( – hatxi 2014-10-07 08:13:34

+0

对不起,我会做一些调查并更改我的答案 – zozelfelfo 2014-10-07 08:18:45

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

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