2010-09-19 78 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查询。