Dzięki, nie miałem ideę aktualizacja z INNER JOIN.
W pierwotnym zapytaniu błędem było nazwanie podkwerendy, która musi zwrócić wartość, a zatem nie może być aliasowana.
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
powinien załatwić sprawę za każdy rekord Konkursu.
aby być zauważonym:
Efekt nie jest dokładnie taka sama jak w zapytaniu proponowanej przez mellamokb, które nie będą aktualizować rekordy konkursowych bez odpowiednich PickPoints.
Od SELECT id, COUNT(*) GROUP BY id
będzie liczyć tylko na istniejących wartości identyfikatorów,
natomiast SELECT COUNT(*)
zawsze zwróci wartość jest 0, jeśli nie wybrano żadnych rekordów.
To może, ale nie musi, stanowić problem dla Ciebie.
0 świadomy wersja zapytania mellamokb byłoby:
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)
Innymi słowy, jeśli nie zostaną znalezione żadne odpowiadające PickPoints, zestaw Competition.NumberOfTeams do zera.
Bardzo dziękuję, że udało się :) Docenić również wyjaśnienie, okrzyki! – user1542043
To wyjaśnienie sprawiło, że była to naprawdę dobra odpowiedź. –