Gracias, yo no tenía la idea de una actualización con INNER JOIN.
En la consulta original, el error fue nombrar la subconsulta, que debe devolver un valor y, por lo tanto, no se puede alias.
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
debe hacer el truco para cada registro de la competencia.
para hacerse notar:
El efecto no es exactamente la misma que la consulta propuesta por mellamokb, que no va a actualizar los registros de la competición sin PickPoints correspondientes.
Desde SELECT id, COUNT(*) GROUP BY id
sólo contará para los valores actuales de las identificaciones,
mientras que un SELECT COUNT(*)
siempre devuelve un valor, siendo 0 si no se seleccionan los registros.
Esto puede, o no, ser un problema para usted. Versión
0-consciente de consulta mellamokb sería:
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)
En otras palabras, si no se encuentran PickPoints correspondientes, establecidos Competition.NumberOfTeams a cero.
Muchas gracias, eso funcionó :) ¡Agradezca también la explicación, aplausos! – user1542043
La explicación hizo de esto una muy buena respuesta. –