我有表用户,其中包含列:id,name,points,extra_points。 当排名是积分和extra_points的总和时,我如何获得特定用户的排名?
对于所有用户列表排名我使用此查询:"SELECT id, (points + extra_points) AS total FROM users ORDER BY total desc";
和带有html ol
标记的while循环(所以有位置编号)。
但我不知道如何显示sinlge用户的排名(在用户个人资料页面中)?
任何帮助都会很棒。
答案 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>