Вам, вероятно, здесь нужен коррелированный подзапрос, чтобы вы могли получить правильное значение для каждого игрока.
Чтобы найти общий счет определенного игрока, этот подзапрос делает это.
SELECT SUM(points) as total
FROM (
SELECT player_id, points
FROM boards_played
WHERE time_played > DATE_SUB(NOW(), INTERVAL 7 DAY)
AND player_id = ***something***
ORDER BY time_played DESC
LIMIT 100
) a
Теперь вам нужно включить это в ваш внешний запрос
UPDATE players p
SET score =
(
SELECT SUM(points) as total
FROM (
SELECT points
FROM boards_played
WHERE time_played > DATE_SUB(NOW(), INTERVAL 7 DAY)
AND points.player_id = p.player_id
ORDER BY time_played DESC
LIMIT 100
) a
)
Почему это называется коррелированным? Строка points.player_id = p.player_id
в подзапросе соотносит его свнешний запрос.Делая это таким образом, можно LIMIT
применять отдельно к очкам каждого игрока.
Но , вам может быть лучше сделать вид, который может вычислить это значение на лету, скореечем обновление таблицы.Тогда вам не нужно постоянно обновлять таблицу.Это будет выглядеть примерно так ( не отлажено ).
CREATE VIEW players_with_score AS
SELECT p.player_id, p.col1, p.col2, p.col3,
(
SELECT SUM(points) as total
FROM (
SELECT points
FROM boards_played
WHERE time_played > DATE_SUB(NOW(), INTERVAL 7 DAY)
AND points.player_id = p.player_id
ORDER BY time_played DESC
LIMIT 100
) a
) score
FROM player p
Тогда вы можете сказать что-то вроде
SELECT player_id, score
FROM players_with_score
WHERE score > 250