任何人都可以看到什么是错与下面的查询?
当我运行它,我得到:
#1064 - 你在你的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的正确语法手册“一个地方a.CompetitionID = Competition.CompetitionID”在8号线
Update Competition
Set Competition.NumberOfTeams =
(
SELECT count(*) as NumberOfTeams
FROM PicksPoints
where UserCompetitionID is not NULL
group by CompetitionID
) a
where a.CompetitionID = Competition.CompetitionID
主要的问题是,因为在那里第一次过滤器适用于表内连子查询执行之前被更新的内部查询不能与在外where
声明你的update
条款。处理这样的情况的典型方法是multi-table update。
Update
Competition as C
inner 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 = A.NumberOfTeams
但是:四联zxsw POI
谢谢,我没有与INNER JOIN的UPDATE的想法。
在原来的查询中,错误是命名的子查询,它必须返回一个值,因此不能使用别名。
http://www.sqlfiddle.com/#!2/a74f3/1
应竞争的每一条记录做的伎俩。
要注意:
其效果是不完全一样的mellamokb提出的查询,它不会与没有相应PickPoints更新比赛的记录。
由于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
只会计数ID的现有值,
而SELECT id, COUNT(*) GROUP BY id
总是会返回一个值,为0如果没有选择记录。
这可能会,也可能不会,是你的问题。
mellamokb查询0识别版本将是:
SELECT COUNT(*)
换句话说,如果没有相应的PickPoints发现,设置Competition.NumberOfTeams为零。
对于不耐烦:
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)
这是UPDATE target AS t
INNER JOIN (
SELECT s.id, COUNT(*) AS count
FROM source_grouped AS s
-- WHERE s.custom_condition IS (true)
GROUP BY s.id
) AS aggregate ON aggregate.id = t.id
SET t.count = aggregate.count
的答案,如上述,减少到了极致。