PHP MySQLi排名位置

时间:2011-04-20 01:52:06

标签: php mysqli ranking

好。这是我第一次在这里问一个问题,所以对我来说没事了^ _ ^

我正在开发各种记分牌。

表结构是ID,UID,UID链接到用户帐户的点。

现在,我有点工作,但我需要一个特定的东西,这个查询是非常完美的。根据排名选择用户。

我会告诉你我的SQL。

SELECT *, @rownum := @rownum + 1 AS `rank` FROM 
            (SELECT * FROM `points_table` `p` 
             ORDER BY `p`.`points` DESC 
             LIMIT 1) 
        `user_rank`, 
        (SELECT @rownum := 0) `r`, `accounts_table` `a`, `points_table` `p`
        WHERE `a`.`ID` = `p`.`UID`

让UID选择人员很简单,但这并不好。我需要这个来拉动用户的等级(这是一个,嗯,假的字段^ ^'在飞行中创建)。这对我来说有点过于复杂,因为我的SQL知识足以进行简单的查询,我从未钻研过别名或嵌套查询,所以你必须相当简单地解释,这样我才能掌握^ ^

提前感谢任何可以协助我解决问题的人:]

1 个答案:

答案 0 :(得分:1)

我认为这里有两个问题。从我可以收集到你想要在两个表上进行连接,按点排序然后返回第n条记录。 我把一个UNTESTED查询放在一起。内部查询对两个表执行连接,外部查询指定仅返回特定行。

此示例返回第4行。

SELECT * FROM
(SELECT *, @rownum := @rownum + 1 AS rank
FROM `points_table` `p` 
JOIN `accounts_table` `a` ON a.ID = p.UID,
(SELECT @rownum:=0) r
ORDER BY `p`.`points` DESC) mytable
WHERE rank = 4

希望这适合你!

我已经改变了应该有希望解决这个问题的答案。顺便说一句,无论你使用php还是mysql获得排名,你仍然会对资源造成沉重压力。在mysql可以计算排名之前,它必须创建每个用户的表,然后对它们进行排序。所以你只是将工作从一个区域移动到另一个区域。随着用户数量的增加,无论您的解决方案如何,查询执行时间也会增加。 MySQL可能需要稍长的时间来执行计算,这就是为什么PHP可能是更理想的解决方案。但我也从经验中知道,有时无关的细节会阻止你拥有一个完全优雅的解决方案。希望改变的代码能够正常工作。