おかげで、私はINNERJOINで更新するという考えを持っていませんでした。
元のクエリでは、サブクエリに名前を付けるのが間違っていました。サブクエリは値を返す必要があるため、エイリアスを作成できません。
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
競争のすべての記録のためのトリックを行う必要があります。
注目される:
効果は、対応するPickPointがないコンペティションレコードを更新しないmellamokbによって提案されたクエリとまったく同じではありません。
SELECT id, COUNT(*) GROUP BY id
IDの既存の値のみがカウントされるため、
一方、aSELECT COUNT(*)
は常に値を返し、レコードが選択されていない場合は0になります。
これはあなたにとって問題かもしれないし、そうでないかもしれません。
0対応バージョンのmellamokbクエリは次のようになります。
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)
つまり、対応するPickPointが見つからない場合は、Competition.NumberOfTeamsをゼロに設定します。