如果值在组中最高,则将列更新为1,否则为0

时间:2015-02-12 15:00:14

标签: mysql sql-update

我有一个包含以下列的表:

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查询中使用SELECTUPDATE,那该效果最佳。

该表有3000万行,所以我想要一个不涉及将所有行复制到其他地方的解决方案。

1 个答案:

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

与往常一样,在测试更新等方面,请务必进行复制/备份......