20

我将继续发布我可怕的 MySQL 代码:

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(302 > uptime, 302, uptime), if(0 > players, 0, players), if(1 > rank, 1, rank)

好的,让我解释一下我正在尝试做什么。

  1. “id”具有唯一索引。如果该索引尚不存在,我想插入这些值。
  2. 如果有重复的键,我想改为更新 3 个字段中的每一个,只有当新值大于表中当前的值时。

看起来我做错了什么,坦率地说,我不知道该怎么做。我试着让它变好,但结果却是一团糟。

我希望有人能引导我朝着正确的方向前进,并帮助我(以及任何其他试图学习的人)学习如何做这样的事情。谢谢你。

4

2 回答 2

36

您的查询看起来不错,但为了清楚起见,您可以改进它:

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
  VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE 
  uptime = GREATEST(uptime, VALUES(uptime)), 
  players = GREATEST(players, VALUES(players)),
  rank = GREATEST(rank, VALUES(rank))
于 2012-04-10T00:22:46.580 回答
6

您可以使用VALUES函数避免一些重复。其他事情在您的查询中都很好

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(VALUES(uptime) > uptime, VALUES(uptime), uptime)
于 2012-04-10T00:21:46.430 回答