2012-04-10 38 views
10

我會繼續前進,我的後可怕的MySQL代碼更大: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個字段中的每一個,只有當新值大於當前表中的值時。

看起來我正在做一些非常錯誤的事情,而且我很坦率地不知道該怎麼做。我試圖把它做好,但事實證明這是一個可怕的混亂。

我希望有人能帶領我走向正確的方向,並幫助我學習(以及任何正在努力學習的人)如何做這樣的事情。謝謝。

+1

所以,你沒那麼好了'uptime',重複它'players'和「排名」,它應該工作 – zerkms 2012-04-10 00:19:45

+0

糟糕。一會兒。我明白你在說什麼,但我不認爲這是真正的問題。編輯:哦,我的天哪,那是問題!繼續並作出答覆。 – fruitcup 2012-04-10 00:20:48

+0

和什麼是實際問題?我沒有在問題中看到 – zerkms 2012-04-10 00:23:31

回答

27

您的查詢似乎不錯,但你可以提高它的清晰度:

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)) 
+2

'GREATEST'和'LEAST' - 這是我總是忘記的;-) +1 – zerkms 2012-04-10 00:24:40

+0

o.O那真是太棒了。 – fruitcup 2012-04-10 00:25:46

+0

GREATEST ...非常方便 – GoldenJoe 2015-04-05 01:30:10

4

您可以使用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) 
+0

我不知道我是如何忽略這樣的事情。什麼是錯字>。> 無論如何,謝謝你發現!我可能從來沒有想過它。這讓我感覺很好,我幾乎沒有錯。 :) – fruitcup 2012-04-10 00:22:36