mysql - PHP MySQLi 排名位置

标签 mysql 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 知识足以进行简单的查询,我从未深入研究过别名或嵌套查询,所以你必须相当简单地解释,以便我能够掌握。

最佳答案

我认为这里有两个问题。据我所知,您想要对两个表进行联接,按点对它们进行排序,然后返回第 n 条记录。 我整理了一个未经测试的查询。内部查询对两个表进行联接,外部查询指定仅返回特定行。

此示例返回第四行。

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 可能是更理想的解决方案。但我也从经验中知道,有时无关的细节会阻止您获得完全优雅的解决方案。希望修改后的代码能够工作。

关于mysql - PHP MySQLi 排名位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5724716/

相关文章:

php - 向贝叶斯排名系统添加额外因素(点击次数)

r - 计算每个组的排名

algorithm - 总分排名算法

java - 如何在发生异常后删除 "null id ...entry (don' t 刷新 session )”

mysql - 无法通过套接字 '/var/lib/mysql/mysql.sock' (2) 连接到本地 MySQL 服务器。 mysql.sock 不存在于/var/lib/mysql/中

mysql - 如何像这样优化查询

mysql - 任何人都可以通过汇总和排名查询来帮助我进行分组吗?

mysql - 有没有更好的方法来为 MySQL 中的临时表分配权限?

mysql - Azure SQL : null fields on get()

mysql - 分配行秩数