Php MySQL Highscores-用户的个人排名:重复条目导致不正确的值

Php MySQL Highscores-用户的个人排名:重复条目导致不正确的值,php,mysql,Php,Mysql,我目前正在用PHP创建一个页面,该页面将显示一个用户及其在我的网站高分中的排名 但是,我有一个字段与其他字段不同,并且没有按预期运行 这是我的桌子: -- ---------------------------- -- Table structure for `playerstats` -- ---------------------------- DROP TABLE IF EXISTS `playerstats`; CREATE TABLE `playerstats` ( `uid`

我目前正在用PHP创建一个页面,该页面将显示一个用户及其在我的网站高分中的排名

但是,我有一个字段与其他字段不同,并且没有按预期运行

这是我的桌子:

-- ----------------------------
--  Table structure for `playerstats`
-- ----------------------------
DROP TABLE IF EXISTS `playerstats`;
CREATE TABLE `playerstats` (
  `uid` int(11) NOT NULL DEFAULT '0',
  `gamelevel` int(11) NOT NULL DEFAULT '0',
  `overall` int(11) NOT NULL DEFAULT '0',
  `overallxp` bigint(20) NOT NULL DEFAULT '0',
  KEY `uid` (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
…以及一些示例数据:

INSERT INTO `playerstats` VALUES ('14950', '123', '1495', '129825211')
INSERT INTO `playerstats` VALUES ('28967', '124', '1495', '127168799')
INSERT INTO `playerstats` VALUES ('95848', '121', '1495', '108481173')
我的问题是:

SELECT count(*) + 1 FROM (SELECT uid, overall, overallxp, gamelevel FROM playerstats GROUP BY playerstats.uid) AS x WHERE overall > (SELECT overall FROM playerstats WHERE uid = ". $userid .")"
…而$userid是:

$userid = (int) $_GET['searched'];
现在,当我导航到userid14950的个人高分时,它会显示该用户的正确总体排名,因为他们是总体XP最高的人。然而,当我访问userid28967或userid95848的个人高分时,他们的总体排名与userid14950相同,原因很可能是因为我没有考虑总体结果相同的用户

我的问题是:如果两个或两个以上的用户共享相同的总体排名,他们会显示正确的排名,而不是重复的排名,我该怎么做

就这样。 非常感谢您的帮助:

谢谢, 标记

试试这个:

SET @rank = 0;
SELECT rank FROM (
    SELECT @rank:=@rank + 1 AS rank, uid FROM playerstats ORDER BY overall DESC, 
    overallxp  DESC
) as tmp WHERE uid = 14950
avove查询将返回user14950的排名

此查询将列出所有用户及其级别

SET @rank=0;
SELECT rank, uid, overall, overallxp FROM (
SELECT @rank:=@rank + 1 AS rank, uid, overall, overallxp FROM playerstats ORDER BY overall DESC, overallxp DESC
) as tmp 
试试这个:

SET @rank = 0;
SELECT rank FROM (
    SELECT @rank:=@rank + 1 AS rank, uid FROM playerstats ORDER BY overall DESC, 
    overallxp  DESC
) as tmp WHERE uid = 14950
avove查询将返回user14950的排名

此查询将列出所有用户及其级别

SET @rank=0;
SELECT rank, uid, overall, overallxp FROM (
SELECT @rank:=@rank + 1 AS rank, uid, overall, overallxp FROM playerstats ORDER BY overall DESC, overallxp DESC
) as tmp 


所以。。。你的问题是什么?所有的球员都有相同的总成绩。在您的查询中,您施加的唯一过滤器是总体过滤器,而不是overallxp@Dancrumb:对不起,哈哈。我的问题是:如果两个或两个以上的用户共享相同的总体排名,我将如何做到这一点,他们将显示正确的排名,而不是重复的排名?@VladBalmos OK。我该如何将overallxp强制加入到查询中,以便正确显示排名?@Mko所以您希望排名基于总体,而overallxp?Sooo。。。你的问题是什么?所有的球员都有相同的总成绩。在您的查询中,您施加的唯一过滤器是总体过滤器,而不是overallxp@Dancrumb:对不起,哈哈。我的问题是:如果两个或两个以上的用户共享相同的总体排名,我将如何做到这一点,他们将显示正确的排名,而不是重复的排名?@VladBalmos OK。我如何将overallxp强制加入到查询中,以便正确显示排名?@Mko所以您希望排名基于总体和overallxp?我会尝试一下,但是,这个问题不仅仅是uid14950。它适用于许多其他用户,因此需要对重复的总体结果进行检查,而不是仅对一次出现使用WHERE条件。上面的代码片段应该可以消除该问题。只需删除where子句,您将拥有所有用户及其级别。我添加了where,作为一个关于如何获取单个用户排名的示例,我得到一个错误:您的SQL语法中有一个错误;查看与您的MySQL服务器版本对应的手册,以了解在第1行的“SELECT rank FROM SELECT@rank:=@rank+1 AS rank,uid FROM character_stats ORDE”附近使用的正确语法。您是从php还是phpMyAdmin运行查询的?发布您正在运行的确切查询。我的两个脚本在我的机器上都运行良好。我正在从PHP运行查询。我的精确查询:$rank\u query=mysqli\u query$database,SET@rank=0;从SELECT@rank:=@rank+1中选择rank、uid、OUTALL、overallxp作为rank、uid、OUTALL、overallxp从playerstats按总描述顺序排列,overallxp DESC作为tmp或printmysqli\U error$数据库;我会尝试一下,但是,这个问题不仅仅是uid14950。它适用于许多其他用户,因此需要对重复的总体结果进行检查,而不是仅对一次出现使用WHERE条件。上面的代码片段应该可以消除该问题。只需删除where子句,您将拥有所有用户及其级别。我添加了where,作为一个关于如何获取单个用户排名的示例,我得到一个错误:您的SQL语法中有一个错误;查看与您的MySQL服务器版本对应的手册,以了解在第1行的“SELECT rank FROM SELECT@rank:=@rank+1 AS rank,uid FROM character_stats ORDE”附近使用的正确语法。您是从php还是phpMyAdmin运行查询的?发布您正在运行的确切查询。我的两个脚本在我的机器上都运行良好。我正在从PHP运行查询。我的精确查询:$rank\u query=mysqli\u query$database,SET@rank=0;从SELECT@rank:=@rank+1中选择rank、uid、OUTALL、overallxp作为rank、uid、OUTALL、overallxp从playerstats按总描述顺序排列,overallxp DESC作为tmp或printmysqli\U error$数据库;