谢谢,我没有使用 INNER JOIN 进行更新的想法。
在原始查询中,错误是为子查询命名,它必须返回一个值,因此不能使用别名。
UPDATE Competition
SET Competition.NumberOfTeams =
(SELECT count(*) -- no column alias
FROM PicksPoints
WHERE UserCompetitionID is not NULL
-- put the join condition INSIDE the subquery :
AND CompetitionID = Competition.CompetitionID
group by CompetitionID
) -- no table alias
应该为每项比赛记录做伎俩。
需要注意:
效果与 mellamokb 提出的查询并不完全相同,后者不会更新没有相应 PickPoints 的竞赛记录。
由于 SELECT id, COUNT(*) GROUP BY id
只会计算现有的 id 值,
而 aSELECT COUNT(*)
将始终返回一个值,如果没有选择记录,则为 0。
这可能对您来说是个问题,也可能不是。
mellamokb 查询的 0 感知版本将是:
Update Competition as C
LEFT join (
select CompetitionId, count(*) as NumberOfTeams
from PicksPoints as p
where UserCompetitionID is not NULL
group by CompetitionID
) as A on C.CompetitionID = A.CompetitionID
set C.NumberOfTeams = IFNULL(A.NumberOfTeams, 0)
换句话说,如果没有找到对应的 PickPoints,则将 Competition.NumberOfTeams 设置为零。