好。这是我第一次在这里问一个问题,所以对我来说没事了^ _ ^
我正在开发各种记分牌。
表结构是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知识足以进行简单的查询,我从未钻研过别名或嵌套查询,所以你必须相当简单地解释,这样我才能掌握^ ^
提前感谢任何可以协助我解决问题的人:]
答案 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可能是更理想的解决方案。但我也从经验中知道,有时无关的细节会阻止你拥有一个完全优雅的解决方案。希望改变的代码能够正常工作。