,一旦玩家完成,使用AJAX查找周围的10个分数。您已经有了此部件的SQL查询。您可以使用PHP在服务器端准备HTML,也可以发送原始数据,以便使用Javascript构建HTML。这可以在一个请求中完成(在PHP中使用json\u encode()返回数组/对象) 如果没有分数低于100分,那么它就不是100分中的一个,什么也不做
否则,询问用户名称,并发送一个新的AJAX请求。SQL可以保持简单: 插入到Highscore集合name=?,score=?,when=NOW()中,一旦玩家完成,使用AJAX查找周围的10个分数。您已经有了此部件的SQL查询。您可以使用PHP在服务器端准备HTML,也可以发送原始数据,以便使用Javascript构建HTML。这可以在一个请求中完成(在PHP中使用json\u encode()返回数组/对象) 如果没有分数低于100分,那么它就不是100分中的一个,什么也不做,php,mysql,sql,database-design,jquery,Php,Mysql,Sql,Database Design,Jquery,否则,询问用户名称,并发送一个新的AJAX请求。SQL可以保持简单: 插入到Highscore集合name=?,score=?,when=NOW()中 每次插入后,删除最低分数 当描述限制为1时,按分数ASC从高分订单中删除 如果要防止作弊,需要在ajax调用中添加哈希。例如,发送(username,score,hash=md5(username.score.“secretphrase”),并检查hash是否仍然与用户名和分数匹配 如果要显示排名和分数,请在表中放置一个“rank”列。插入分数时
更新Highscore set rank=rank+1,其中分数<?
- 我不能完全理解你的问题,但基于此:
“我知道,只要让用户先输入他们的详细信息,然后从前10名的结果中挑出他们是否获得了这些结果,就更容易了,但我的想法是,我希望任何人都能够获得某种输入,因为这将鼓励人们玩得更多。”
我怀疑您希望显示给用户的分数表看起来像这样:
1. John Doe (score: 1,000,000)
2. Larry Roe (score: 999,999)
3. Jane Doe (score: 985,742)
...
5746. Susan Player (score: 894)
5747. *** YOU *** (score: 893)
5748. Joe R. Player (score: 889)
我赞同Mytskine最初的建议,即您根本不应该尝试在DB中存储排名-保持排名列为最新是可能的,就像Mytskine在其答案末尾所显示的那样,但这是一项大量的工作,如果有任何收获的话,也是微乎其微的。只需让您的分数表包含明显的列,如name
和score
和,加上一个自动增量列时间
现在,让我们假设您想显示N名得分最高的球员,以及新得分前后的K名球员。首先,我们需要计算球员的排名:id
在这里,SELECT COUNT(*) + 1 FROM scores WHERE score > ?
是玩家分数的占位符。这计算有多少玩家的分数高于我们将在下面插入的分数。如果我们在平局中支持最新的分数,这个加上一将是玩家的排名。让我们用R表示这个排名 现在,如果R?
否则,我们需要分三步进行:首先,获取前N个条目: 然后,播放器上方的K个条目:SELECT * FROM scores ORDER BY score DESC, time DESC LIMIT N
SELECT * FROM scores WHERE score > ? ORDER BY score ASC, time ASC LIMIT K
最后是播放器下面的K项:SELECT * FROM scores WHERE score <= ? ORDER BY score DESC, time DESC LIMIT K
SELECT * FROM scores WHERE score > ? ORDER BY score ASC, time ASC LIMIT K
SELECT * FROM scores WHERE score <= ? ORDER BY score DESC, time DESC LIMIT K
如果你愿意,你也可以在这一点上删除数据库中的最低分数来限制它的大小,但实际上这可能并不重要,除非你有几十亿的玩家。(一个分数条目需要几十个字节,主要取决于玩家输入的名字的长度,所以一百万个条目仍然只有几十兆字节。)但是,你应该记住在以保持查询效率。我无法完全理解您的问题,但基于此: “我知道,只要让用户先输入他们的详细信息,然后从前10名的结果中挑出他们是否获得了这些结果,就更容易了,但我的想法是,我希望任何人都能够获得某种输入,因为这将鼓励人们玩得更多。” 我怀疑您希望显示给用户的分数表看起来像这样:(分数,时间)上创建索引
我赞同Mytskine最初的建议,即您根本不应该尝试在DB中存储排名-保持排名列为最新是可能的,就像Mytskine在其答案末尾所显示的那样,但这是一项大量的工作,如果有任何收获的话,也是微乎其微的。只需让您的分数表包含明显的列,如1. John Doe (score: 1,000,000) 2. Larry Roe (score: 999,999) 3. Jane Doe (score: 985,742) ... 5746. Susan Player (score: 894) 5747. *** YOU *** (score: 893) 5748. Joe R. Player (score: 889)
和name
score
和,加上一个自动增量列时间
现在,让我们假设您想显示N名得分最高的球员,以及新得分前后的K名球员。首先,我们需要计算球员的排名:id
在这里,SELECT COUNT(*) + 1 FROM scores WHERE score > ?
是玩家分数的占位符。这计算有多少玩家的分数高于我们将在下面插入的分数。如果我们在平局中支持最新的分数,这个加上一将是玩家的排名。让我们用R表示这个排名 现在,如果R?
否则,我们需要分三步进行:首先,获取前N个条目: 然后,播放器上方的K个条目:SELECT * FROM scores ORDER BY score DESC, time DESC LIMIT N
SELECT * FROM scores WHERE score > ? ORDER BY score ASC, time ASC LIMIT K
最后是播放器下面的K项:SELECT * FROM scores WHERE score <= ? ORDER BY score DESC, time DESC LIMIT K
SELECT * FROM scores WHERE score > ? ORDER BY score ASC, time ASC LIMIT K
SELECT * FROM scores WHERE score <= ? ORDER BY score DESC, time DESC LIMIT K
如果你愿意,你也可以在这一点上删除数据库中的最低分数来限制它的大小,但实际上这可能并不重要,除非你有几十亿的玩家。(一个分数条目需要几十个字节,主要取决于玩家输入的名字的长度,所以一百万个条目仍然只有几十兆字节。)但是,你应该记住在上创建一个索引,以保持查询的效率。你能问一下你的“高级/设计类型问题”吗?我看不出你所描述的有什么困难。你需要什么帮助?对不起,我知道这听起来很糟糕,但我更像是一个前端人员,我对SQL几乎没有经验,但是我意识到我应该单独执行两个SQL查询,然后在构建HTML ta时将输入框放在两组结果之间对于PHP来说,这应该是显而易见的。我想剩下的唯一问题是如何(分数,时间)