与子查询的MySQL更新查询

问题描述 投票:48回答:3

任何人都可以看到什么是错与下面的查询?

当我运行它,我得到:

#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
mysql sql
3个回答
130
投票

主要的问题是,因为在那里第一次过滤器适用于表内连子查询执行之前被更新的内部查询不能与在外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


19
投票

谢谢,我没有与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为零。


10
投票

对于不耐烦:

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 的答案,如上述,减少到了极致。

© www.soinside.com 2019 - 2024. All rights reserved.