我有一个包含以下列的表:
player_id, datetime, player_level, is_latest
我需要做的是设置is_latest = 1
,当玩家datetime
最高时。
这是我为玩家检查最高日期时间的方式:
SELECT player_id, MAX(datetime)
FROM players
GROUP BY player_id
现在我需要更新整个表:
UPDATE players
SET is_latest = /* 1 if datetime = MAX(datetime), 0 otherwise */
您对如何撰写UPDATE
声明有什么想法吗?如果我可以在单个SQL查询中使用SELECT
和UPDATE
,那该效果最佳。
该表有3000万行,所以我想要一个不涉及将所有行复制到其他地方的解决方案。
答案 0 :(得分:1)
我不知道这是否是最快的方式,但是这个查询应该做你想要的,并让你对一般语法有所了解:
UPDATE players p
LEFT JOIN (
SELECT player_id, MAX(datetime) max_date
FROM players
GROUP BY player_id
) t ON p.player_id = t.player_id AND p.datetime = t.max_date
SET p.is_latest = (t.max_date IS NOT NULL);
使用left join
表示与p.datetime = t.max_date
谓词不匹配的行将为null
,我们可以在set
中的布尔表达式中使用这一事实确保只将最新行设置为1并将较旧的行设置为0的子句。
有关示例,请参阅此SQL Fiddle。
与往常一样,在测试更新等方面,请务必进行复制/备份......