MySQL更新列使用group by

时间:2015-02-02 22:06:45

标签: mysql mysql-error-1064

我尝试使用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;

并且似乎只是更新表格中的第一行? 有没有办法更新表中的所有行?

谢谢,

2 个答案:

答案 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