【问题标题】:how to get position rank of specific row using just mysql query?如何仅使用 mysql 查询获取特定行的位置排名?
【发布时间】:2011-06-02 19:47:17
【问题描述】:

我有表用户,其中包含列:id、name、points、extra_points。 当排名是点数和 extra_points 的总和时,如何获得特定用户的排名?

对于所有用户列表排名 Im 使用此查询:"SELECT id, (points + extra_points) AS total FROM users ORDER BY total desc"; 和带有 html ol 标记的 while 循环(因此有位置编号)。 但我不知道如何显示单个用户的排名(在用户个人资料页面中)? 任何帮助都会很棒。

【问题讨论】:

标签: php mysql


【解决方案1】:
SELECT users1.id, (users1.points+users1.extra_points) AS total, COUNT(*)+1 AS rank
FROM users users1
INNER JOIN users users2 ON users1.points+users1.extra_points < users2.points+users2.extra_points
WHERE users1.id = $id

【讨论】:

  • 谢谢,这是有效的 :) 只需要更改开头为:SELECT users1.id, (users1.points+users1.extra_points) AS...
  • 感谢您发现这个小错误,我现在已经修复了!
  • 请注意,在严格的 SQL 中,此查询将需要 GROUP BY user1.id, users1.points, users1.extra_points。这也将结果集限制为只有一行(而不是与排名一样多的行)。
【解决方案2】:

好吧,对于单个用户,您可以更改选择查询,使其看起来像

"SELECT (points + extra_points) AS total FROM users WHERE id = $id LIMIT 1"

需要指定哪个用户作为 WHERE 子句。此外,由于您可能已经知道 id,因此不需要选择它,并且由于它只是一个用户,因此也不需要 ORDER BY。 LIMIT 1 将阻止它在找到后检查其余行。

【讨论】:

  • 哦,等等,您需要知道排名,它与其他排名相匹配。一分钟,让我想想。
  • 您必须执行某种 SELECT COUNT(*),其中他们的 (points + extra_points) 小于其他用户 (points+extra_points)
【解决方案3】:

这没有经过测试,但我希望你能理解我的想法 - 只需使用子选择来计算所有得分更高的用户:

SELECT
  id,
  (points + extra_points) AS total,
  (SELECT COUNT(*) FROM users WHERE (points + extra_points)) >= (u.points + u.extra_points) AS rank 
FROM 
  users u 
WHERE 
  id = ?;

【讨论】:

    【解决方案4】:

    如果您在名为 Client 的表中有 ClientID 和 Points 列,则答案如下:

    <CFQUERY DATASOURCE="YourDatasource" name="YourQueryName">
    SELECT ClientID, (Pts) AS total,   
    (SELECT COUNT(*) FROM Client 
    WHERE (Pts) >= (u.Pts)) AS rank  
    FROM Client u  
    WHERE ClientID = CLIENTID_OF_YOUR_CHOICE_HERE; 
    </CFQUERY>
    

    【讨论】:

    • 只是我,还是这不是 PHP? (这就是问题的标记。)
    • 老兄,这个问题被标记为 PHP,而你的答案是用 ColdFusion 标记写的。我知道什么是 SQL;我不知道为什么您的答案中有 ColdFusion。感谢您的人身攻击,这是受欢迎且非常必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多