MySQL查找行索引位置,复杂查询

MySQL查找行索引位置,复杂查询,mysql,select,indexing,position,row,Mysql,Select,Indexing,Position,Row,我知道这个问题在这里已经被问过很多次了,我已经浏览了这里的大部分帖子,但是我不能让它工作,所以我想再问一次 问题: 有一个分数列表,我试图向用户展示他/她在分数列表中的位置。有一个玩家id,用户从两个表中选择(players.id,scores.player\u id)。我从来没有尝试过这样的查询,我根据这个网站上的说明写了这样的东西,但是运气不好,这个查询不对,这里有点迷路了 SELECT @rn:=@rn + 1 AS rank, scores.score FROM (SE

我知道这个问题在这里已经被问过很多次了,我已经浏览了这里的大部分帖子,但是我不能让它工作,所以我想再问一次

问题:
有一个分数列表,我试图向用户展示他/她在分数列表中的位置。有一个玩家id,用户从两个表中选择(players.id,scores.player\u id)。我从来没有尝试过这样的查询,我根据这个网站上的说明写了这样的东西,但是运气不好,这个查询不对,这里有点迷路了

SELECT 
    @rn:=@rn + 1 AS rank, scores.score
FROM
    (SELECT 
        scores.score, COUNT(*) AS ordercount
    FROM
        scores, players
    WHERE
        players.uid = '$uid'
            AND scores.version = '$version'
            AND scores.lvl = '$lvl'
            AND scores.player_id = players.id
    GROUP BY scores.score
    ORDER BY scores.score DESC) t1,
    (SELECT @rn:=0) t2
结果:

Unknown column 'scores.score' in 'field list
谢谢

评分表结构:

CREATE TABLE IF NOT EXISTS `scores` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `player_id` int(11) NOT NULL,
  `lvl` tinyint(4) NOT NULL,
  `score` bigint(20) NOT NULL,
  `played_times` bigint(20) NOT NULL,
  `version` varchar(10) NOT NULL,
  `ip` varchar(30) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `players` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `email` varchar(255) NOT NULL,
  `pass` varchar(255) NOT NULL,
  `hash` varchar(255) NOT NULL,
  `uid` varchar(255) NOT NULL,
  `ip` varchar(30) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
--

--正在转储表
分数的数据
播放器表结构:

CREATE TABLE IF NOT EXISTS `scores` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `player_id` int(11) NOT NULL,
  `lvl` tinyint(4) NOT NULL,
  `score` bigint(20) NOT NULL,
  `played_times` bigint(20) NOT NULL,
  `version` varchar(10) NOT NULL,
  `ip` varchar(30) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `players` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `email` varchar(255) NOT NULL,
  `pass` varchar(255) NOT NULL,
  `hash` varchar(255) NOT NULL,
  `uid` varchar(255) NOT NULL,
  `ip` varchar(30) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
--

--正在转储表
分数的数据
PHP


如果您将表引用从scores更改为t1,因为您正在对子查询使用别名,该怎么办

SELECT 
        @rn:=@rn + 1 AS rank, t1.score
    FROM
        (SELECT 
            scores.score, COUNT(*) AS ordercount
        FROM
            scores, players
        WHERE
            players.uid = '$uid'
                AND scores.version = '$version'
                AND scores.lvl = '$lvl'
                AND scores.player_id = players.id
        GROUP BY scores.score
        ORDER BY scores.score DESC) t1,
        (SELECT @rn:=0) t2
--编辑


您可以单独查询,返回播放和显示的用户数,即25/100

Hi Edga,谢谢您的回复。。我已经测试了您的查询,它似乎应该可以工作,但我已经通过在分数列表中输入另一个用户id的更好分数进行了测试,但仍然返回排名为1,其中它假设为2。这是不对的,因为另一个用户在列表上有更好的分数,因此它应该显示为第二而不是第一。无论结果如何,排名都是1$x=mysql\u fetch\u数组($q)$a=$x[“排名”];echo$a;结果:1您的初始问题是否有错误?这听起来像是不同的问题,对吗?现在没有错误,但不会从分数列表中返回用户的位置:\你能包括(编辑你的初始问题或打开一个新问题)数据样本、表结构和声明
@rn
的位置吗?我已经在主Q中添加了样本数据和php函数。
SELECT 
        @rn:=@rn + 1 AS rank, t1.score
    FROM
        (SELECT 
            scores.score, COUNT(*) AS ordercount
        FROM
            scores, players
        WHERE
            players.uid = '$uid'
                AND scores.version = '$version'
                AND scores.lvl = '$lvl'
                AND scores.player_id = players.id
        GROUP BY scores.score
        ORDER BY scores.score DESC) t1,
        (SELECT @rn:=0) t2
SELECT COUNT(t1.player_id)
    FROM
        (SELECT 
            scores.player_id
        FROM
            scores
            INNER JOIN players ON scores.player_id = players.id
        WHERE
            players.uid = '$uid'
            AND scores.version = '$version'
            AND scores.lvl = '$lvl'
            AND scores.player_id = players.id
            AND scores.score >= '$score'
        GROUP BY scores.player_id) t1