2010-09-19 81 views
1

使用MySQL和PHP,我有一個簡單的排名表,有2列userscore維護排名表的最佳做法是什麼?

每週一次,我重新運行排名腳本並計算每個用戶的分數。

  • 許多用戶有新的成績
  • 一些不
  • 有時有新的用戶添加到表

什麼是與MySQL接近這一目標的最佳方式是什麼?如果我需要添加新行,update是否工作? insert會覆蓋現有的行,這樣我可以再次插入整個表?最好是放棄表格並重新寫入它?

**Sample Data** 

User01 2500 
User02 3000 
User03 100 

**New Data to be Added** 

User01 2700 
User02 4000 
User04 1000 // new account 

除非有成千上萬的用戶...

+0

請添加一些樣本數據,你有什麼,你想要什麼? – 2010-09-19 02:34:35

回答

1

需要時REPLACE ... INTO語法將插入新行和刪除+插入現有行:

# deletes existing and inserts new row: 
REPLACE INTO users SET score = 2000, username = 'User01'; 
# deletes existing and inserts new row 
REPLACE INTO users SET score = 3000, username = 'User02'; 
# inserts new row 
REPLACE INTO users SET score = 4000, username = 'User04'; 

http://dev.mysql.com/doc/refman/5.0/en/replace.html

我最喜歡的方法,雖然是使用ON DUPLICATE KEY語法 - 主要是因爲我一直假定刪除一行然後重新插入它會更加「昂貴」,然後只更新現有的行。假設username字段是UNIQUEPRIMARY KEY指數,你可以做到以下幾點:

# Updates existing User01 row 
INSERT INTO users SET score = 2000, username = 'User01' ON DUPLICATE KEY UPDATE score = 2000; 
# Updates existing User02 row 
INSERT INTO users SET score = 3000, username = 'User02' ON DUPLICATE KEY UPDATE score = 2000; 
# Inserts new User04 row 
INSERT INTO users SET score = 4000, username = 'User04' ON DUPLICATE KEY UPDATE score = 2000; 

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

0

INSERT不會覆蓋現有的行,而是產生一個錯誤(如果,例如,您標記的用戶列獨特,並嘗試添加一個已經現有用戶)。同樣,UPDATE不會插入新行,只會改變現有行。

如果大多數用戶需要更新並且有用戶應該放棄,即不再包含在新評分表中,那麼刪除並重寫整個表似乎是可接受的解決方案。

否則,我會更新表:

的便攜式解決方案是檢查密鑰(即用戶)是否已經包含在該表(經由SELECT),並使用然後或者插入用於不存在的鍵或更新已有的密鑰。當然,您也可以嘗試INSERT並檢查錯誤代碼,如果出現約束違規錯誤,則退回到UPDATE。

在MySQL中,你還可以使用下面的語法,它允許你只用一個單一的查詢操作:

INSERT INTO ... ON DUPLICATE KEY UPDATE score = ... 

然而,這是不可移植的,不會與其他RDBMS工作,只能使用MySQL。

0

正如您所提到的雙向

更新或插入

我覺得INSERT將超過更新好。爲插入您添加一個查詢。至於更新,你必須爲每個用戶運行2個查詢。首先選擇用戶,然後根據userId進行更新。

所以最快將插入,你可以總結任何時候使用sql查詢。