我正在开发某种记分板。表结构是 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/