我尝试使用group by子句更新AVG列,如下所示:
UPDATE cratings r
LEFT JOIN (SELECT race_id, runner_id, avg(final) AS avg FROM cratings GROUP BY race_id) u
ON r.race_id = u.race_id and R.RUNNER_ID = U.RUNNER_ID
SET r.AVG = u.AVG;
并且似乎只是更新表格中的第一行? 有没有办法更新表中的所有行?
谢谢,
答案 0 :(得分:0)
是。只需加入race_id
:
UPDATE cratings r JOIN
(SELECT race_id, avg(final) AS avg
FROM cratings
GROUP BY race_id
) u
ON r.race_id = u.race_id
SET r.AVG = u.AVG;
在runner_id
子句中使用select
不会被(几乎?)除MySQL以外的任何其他数据库所接受。它困惑了你。实际上,除非你真的知道自己在做什么,否则不应该在聚合查询的select
中添加额外的列。 select
中的所有列都应位于group by
中,或者是聚合函数的参数(sum()
,min()
,max()
等。)。
答案 1 :(得分:0)
内联视图(子查询)中的GROUP BY
子句仅包含race_id
列。 MySQL将在SELECT列表中返回runner_id
的值,但它返回的值将来自组中的不确定行。
外部查询的连接谓词引用runner_id
列,因此只会更新匹配runner_id
的行。
我怀疑你要么:
... GROUP BY race_id, runner_id ) u
^^^^^^^^^^^
或者,如果您想要给定比赛中所有参赛者的平均值,您希望省略 SELECT列表中的runner_id
列,省略联接谓词runner_id
,a:
(SELECT race_id, avg(final) AS avg FROM ...
ON r.race_id = u.race_id