如何使用mysql查询获取特定行的位置排名?

时间:2011-01-03 12:01:42

标签: php mysql

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

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

嗯,对于单个用户,您需要更改选择查询,使其看起来像

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

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

答案 2 :(得分:0)

这未经过测试,但我希望你能理解我的想法 - 只需使用一个子选择来计算所有用户的点数:

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 = ?;

答案 3 :(得分:0)

如果您在名为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>