MySQL 高分 - 用户的个人排名:重复的条目导致不正确的值
Posted
技术标签:
【中文标题】MySQL 高分 - 用户的个人排名:重复的条目导致不正确的值【英文标题】:MySQL Highscores - User's Personal Ranks: Duplicate Entries Causing Incorrect Values 【发布时间】:2012-08-23 12:12:08 【问题描述】:我目前正在用 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 相同(很可能是因为我没有考虑到总体结果相同的用户)。
我的问题是:如果两个(或更多)用户共享相同的整体,我将如何实现它,他们会显示正确的排名,而不是重复的排名?
就是这样。 非常感谢任何帮助:)
谢谢, 标记
【问题讨论】:
Sooo...你有什么问题? 所有球员的总体成绩都一样。在您的查询中,您施加的唯一过滤器是整体而不是整体xp @Dancrumb:对不起,哈哈。我的问题是:如果两个(或更多)用户共享相同的整体,我将如何做到这一点,他们会显示正确的排名,而不是重复的排名? @VladBalmos 好的。我将如何将整体xp 强加到查询中,以便正确显示排名? @Mko 所以您希望排名基于整体和整体xp? 【参考方案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
【讨论】:
我会试一试,但是,这个问题不仅仅存在于 uid14950。它存在于许多其他用户中,因此需要对重复的整体结果进行检查,而不是只针对一次出现使用 WHERE 条件。 上面的 sn-p 应该可以解决这个问题。只需删除 where 子句,您将拥有所有用户及其等级。我添加了 where 只是作为如何获取单个用户排名的示例 我收到一条错误消息:您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的“SELECT rank FROM (SELECT @rank:=@rank + 1 AS rank, uid FROM character_stats ORDE”附近使用正确的语法 您是从 php 还是 phpMyAdmin 运行查询?发布您正在运行的确切查询。我的两个脚本在我的机器上运行良好 我正在从 PHP 运行查询。我的确切查询: $rank_query = mysqli_query($database, "SET @rank=0; SELECT rank, uid, general, wholexp FROM (SELECT @rank:=@rank + 1 AS rank, uid, whole, wholexp FROM playerstats ORDER BY整体 DESC,overallxp DESC) as tmp") 或 print(mysqli_error($database));以上是关于MySQL 高分 - 用户的个人排名:重复的条目导致不正确的值的主要内容,如果未能解决你的问题,请参考以下文章