2015-02-02 5 views
0

Я пытаюсь использовать группу пункта, чтобы обновить столбец AVG следующим образом:MySQL столбец обновления с помощью группы по

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; 

, и все это, кажется, делает обновление верхней строки в таблице? Есть ли способ обновить все строки в таблице?

Thanks,

+0

Трудно сказать, не видя данные образца из таблицы ящиков. С первого взгляда кажется странным, что вы будете группироваться только с помощью race_id, но присоединитесь как к race_id, так и к runner_id. –

ответ

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() и т. Д.).

0

Предложение GROUP BY в строчном представлении (подзапросе) включает только столбец race_id. MySQL вернет значение для runner_id в списке SELECT, но возвращаемое значение будет из неопределенной строки в группе.

Предикат объединения по внешнему запросу ссылается на столбец runner_id, поэтому будут обновляться только строки, имеющие соответствие runner_id.

Я подозреваю, что вы либо хотите:

... GROUP BY race_id, runner_id) u 
        ^^^^^^^^^^^ 

Или, если вы хотите, в среднем для всех бегунов в данной гонке, вы хотите опустить в runner_id столбец из списка Выбор и опускаем предикат соединения на runner_id, a:

 (SELECT race_id, avg(final) AS avg FROM ... 
    ON r.race_id = u.race_id 
Смежные вопросы