我有一个复杂的查询,归结为:
UPDATE usertable
SET userstatus =
(SELECT numposts*5 as status FROM
(SELECT count(*) as numposts FROM poststable WHERE poststable.userid = usertable.userid) as table2
)
WHERE usertable.userid > 0
这是一个更新每个用户记录的查询,并根据子表中的行数将用户的状态设置为某个计算值。
问题是usertable.userid没有将其降低到二级子查询。
查询的工作方式如下所示,只有一个级别:
UPDATE usertable
SET userstatus =
(SELECT count(*) as numposts FROM poststable WHERE poststable.userid = usertable.userid)
WHERE usertable.userid > 0
问题是实际情况下的计算查询非常复杂。
问题是:有没有办法让第二级子查询识别顶级查询中的值?在这个例子中,有没有办法让usertable.userid识别出2个级别?
谢谢! -Nico
答案 0 :(得分:1)
不是逐行执行相关子查询,而是生成派生表作为所有用户ID的一次子查询,然后将其连接到要更新的表。 MySQL支持多表更新语法:
UPDATE usertable AS u
LEFT OUTER JOIN (
SELECT userid, COUNT(*) AS numposts
FROM poststable
GROUP BY userid
ORDER BY NULL
) AS t USING (userid)
SET u.userstatus = 5 * COALESCE(t.numposts, 0)
WHERE u.userid > 0
我知道你说你的真实查询更复杂,但同样的原则可以解决它。