2013-11-23 88 views
0

我想创建一个系统来跟踪游戏中玩家的进度。每个玩家可以是多个组的成员,这些组都有其他要求。为了追踪他的进步,一旦他加入队伍,球员的统计数据将被保存。每次他重新加载他的统计数据时,现在的数据都应该保存在数据库中。MySQL插入或替换

播放器的所有属性都以json格式存储,然后由PHP或JS进行解析。一旦玩家加入一个组,就会设置比较= 0的条目。比较= 1的条目应该在玩家第一次点击时创建更新统计信息并且从此只应更新,而不是新创建。

现在我的问题是:如何做到这一点?当通过INSERT INTO的语法阅读我有以下几点:

INSERT INTO `groups` (`grp`, `id`, `json`, `compare`) VALUES 
($grp, $id, $json, 1) ON DUPLICATE KEY SET `json` = $json 

然而,由于没有按键,我不知道我是否能建立两/三键(因为可能有多个每个用户的组,以及同一组中的compare = 0条目),我不认为我可以这样做。

+------+----+---------+---------+ 
| grp | id | json | compare | 
+------+----+---------+---------+ 
| 1 | 1 | stats | 0 | 
| 1 | 1 | stats | 1 | 
| 1 | 2 | stats | 0 | 
| 1 | 2 | stats | 1 | 
| 2 | 2 | stats | 0 | 
| 2 | 3 | stats | 0 | 
| 2 | 3 | stats | 1 | 
| 2 | 4 | stats | 0 | 
| 2 | 5 | stats | 0 | 
+------+----+---------+---------+ 

grp是该组的球员。有设置为 数组的玩家可以在。

id是玩家的ID没有真正的限制。

json包含json 格式(点数等)的玩家统计数据。

compare是一个布尔值。 0代表入场数据(他注册时球员已经拥有的积分数量),1代表当前数据 - 将 与入场数据进行比较,以获得差异(=积分 玩家自加入集团以来)。

我希望我的解释是可以理解的,有人可以帮助我。

+0

是什么原因,你不只是有两列:initialstats和currentstats? –

+0

如果它不是该表的真实ID,则不会调用列标识。将其称为user_id/player_id –

+0

@RiccardoGalli我的数据库中的列命名有所不同,为了易于理解,我重新命名了它们。 – Padarom

回答

1

您可以创建具有多列的唯一密钥。这将触发'重复'条款。

ALTER TABLE groups 
ADD UNIQUE (grp, id, compare) 
+0

我会尽力,谢谢:) – Padarom

2

您可以使用插入raplace:

REPLACE INTO groups (`grp`, `id`, `json`, `compare`) VALUES (...); 

但你必须在表的主键。替换为自动查找主键,如果记录存在,则更新行,但如果不存在,则会添加新行。