MySQL 限制用于计算 SUM 的行数
MySQL limit number of rows used to calculate the SUM
我正在制作一款每小时计算玩家分数的游戏。需要分数,以便排行榜可以显示排名最高的玩家。 'points' 在游戏中获胜的玩家存储在 boards_played table 中。玩家 table 有一个分数字段,每小时更新一次 SQL:
update players p
inner join (
SELECT player_id, sum(points) as total
from boards_played
where time_played > DATE_SUB(now(), INTERVAL 7 DAY)
GROUP BY player_id) s on p.player_id = s.player_id
set p.score = s.total
问题是在 100 场比赛中获得 50 分的人应该比在 200 场比赛中获得 60 分的人排名更好。
简而言之,分数应该只基于你最近 7 天的最后 100 场比赛。
你可能需要一个相关的子查询,这样你就可以为每个玩家检索正确的值。
要找到某个玩家的总分,这个子查询就可以做到。
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
分别应用于每个玩家的点数。
但是,你最好创建一个可以动态计算这个值的视图,而不是更新你的table。那么您就不必担心一直更新您的 table 了。它看起来像这样(未调试)。
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
我正在制作一款每小时计算玩家分数的游戏。需要分数,以便排行榜可以显示排名最高的玩家。 'points' 在游戏中获胜的玩家存储在 boards_played table 中。玩家 table 有一个分数字段,每小时更新一次 SQL:
update players p
inner join (
SELECT player_id, sum(points) as total
from boards_played
where time_played > DATE_SUB(now(), INTERVAL 7 DAY)
GROUP BY player_id) s on p.player_id = s.player_id
set p.score = s.total
问题是在 100 场比赛中获得 50 分的人应该比在 200 场比赛中获得 60 分的人排名更好。
简而言之,分数应该只基于你最近 7 天的最后 100 场比赛。
你可能需要一个相关的子查询,这样你就可以为每个玩家检索正确的值。
要找到某个玩家的总分,这个子查询就可以做到。
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
分别应用于每个玩家的点数。
但是,你最好创建一个可以动态计算这个值的视图,而不是更新你的table。那么您就不必担心一直更新您的 table 了。它看起来像这样(未调试)。
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