2011-08-28 58 views

回答

3

在這個例子中,我們打電話給你的表的分數:

確保你有一個唯一索引

ALTER TABLE scores ADD UNIQUE INDEX user_category_ndx (user,category); 

現在運行它來取代:

INSERT INTO scores (user,category,score) VALUES ('username','mycat',127) 
ON DUPLICATE KEY UPDATE score = VALUES(score); 

如果您的更新得分意味着加分,然後這樣做:

INSERT INTO scores (user,category,score) VALUES ('username','mycat',127) 
ON DUPLICATE KEY UPDATE score = score + VALUES(score); 

試試吧!

UPDATE 2011-08-28 09:00 EDT

如果你想保持公正高分,然後添加唯一索引,這裏是你必須做的:

CREATE TABLE scores_new LIKE scores; 
ALTER TABLE scores_new ADD UNIQUE INDEX user_category_ndx (user,category); 
INSERT INTO scores_new (user,category,score) 
SELECT user,category,MAX(score) FROM scores GROUP BY user,category; 
ALTER TABLE scores RENAME scores_old; 
ALTER TABLE scores_new RENAME scores; 
# 
# Drop old table if no longer needed 
# 
DROP TABLE scores_old; 

UPDATE 2011-08-28 10:53 EDT

運行是爲了保持最高得分:

INSERT INTO scores (user,category,score) VALUES ('username','mycat',127) 
ON DUPLICATE KEY UPDATE score = GREATEST(VALUES(score),score); 
+0

這似乎是正確的,但我不能添加唯一索引,因爲此索引的大量重複行已經存在。有什麼方法可以刪除重複項並只保留最高分的那一行?我試圖循環所有的組合,但它不起作用,我想必須有更好的方法。 – Fred

+0

非常感謝您的第一個答案以及更新!這正是我需要的。 – Fred

相關問題