Danke, ich habe nicht die Idee eines UPDATE mit INNER JOIN.
In der ursprünglichen Abfrage war der Fehler, die Unterabfrage zu benennen, die einen Wert zurückgeben muss und daher nicht Alias sein kann.
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
sollte den Trick für jede Aufzeichnung des Wettbewerbs tun.
Zu bemerken:
Der Effekt nicht genau die gleiche wie die Abfrage von mellamokb vorgeschlagen ist, die nicht Wettbewerb Aufzeichnungen ohne entsprechende Pickpoints aktualisieren.
Seit SELECT id, COUNT(*) GROUP BY id
wird nur für bestehende Werte von ids zählen,
während ein SELECT COUNT(*)
immer einen Wert zurück, wobei 0, wenn keine Datensätze ausgewählt sind.
Dies kann oder kann kein Problem für Sie sein.
0-aware Version von mellamokb Abfrage wäre:
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)
Mit anderen Worten, wenn keine entsprechenden Pickpoints zu finden sind, stellen Competition.NumberOfTeams auf Null.
Vielen Dank, das hat den Trick :) Schätzen Sie auch die Erklärung, Prost! – user1542043
Die Erklärung machte dies zu einer wirklich guten Antwort. –