1

私は現在、自分のサイトのハイスコアでユーザーとそのランクを表示するページをPHPで作成しています。

ただし、他のフィールドとは異なり、意図したとおりに機能していないフィールドが1つあります。

これが私のテーブルです:

-- ----------------------------
--  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の個人のハイスコアに移動すると、そのユーザーは全体で最高のoverallxpを持っているため、そのユーザーの正しい全体的なランキングが表示されます。ただし、userid28967またはuserid95848の個人的なハイスコアにアクセスすると、何らかの理由でそれらの全体的なランクはuserid14950と同じになります(おそらく、同じ全体的な結果を持つユーザーを考慮していないためです)。

私の質問は、2人(またはそれ以上)のユーザーが全体的に同じランクを共有している場合、重複したランクではなく、正しいランクが表示されるようにするにはどうすればよいですか?

以上です。
どんな助けでも大歓迎です:)

ありがとう、
マーク

4

1 に答える 1

1

これを試して:

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 
于 2012-08-23T12:48:40.253 に答える