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 つのフィールドのそれぞれを UPDATE したいのですが、新しい値が現在テーブルにある値よりも大きい場合のみです。

私はひどく間違ったことをしているように見えます。率直に言って、何をすべきかわかりません。私はそれを良くしようとしましたが、それは恐ろしい混乱であることが判明しました.

誰かが私を正しい方向に導き、このようなことを行う方法を私 (および学ぼうとしている他の人) に教えてくれることを願っています。ありがとうございました。

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 に答える