假设我有一个包含以下列的表:
p_id
userid
点
假设这些列有5000多条记录。所以我们实际上有一些有积分的用户。每个用户的点记录都有一个唯一的行。想象一下,每个用户都可以通过点击某个地方在网站上获得积分。当他们点击时,我会用他们得到的分数更新数据库。
所以我们有一个表格,上面有5000多个有积分的人的记录,对吧?现在我想按点(降序)对它们进行排序,所以如果我运行MySQL查询,那么点最多的用户将位于页面顶部。
我可以通过简单地运行这样的查询来做到这一点:
SELECT `p_id` FROM `point_table` ORDER BY `points` DESC
这个查询将按点数降序提供所有记录。
好的,我的问题来了,现在(当订购时)我想向每个用户显示他们实际在哪个地方。因此,我想给每个用户这样的东西:"你是5374个用户中的623个"。问题是我不能指定"623"这个数字。
我想运行一个查询,该查询是按点对表进行排序它应该"搜索"或计算其记录所在的行号,然后将该值返回给我。
有人能帮我如何为此构建查询吗?这将是一个非常大的帮助。非常感谢。
这个答案应该适用于您:
SET @rank=0;
SELECT @rank:=@rank+1 AS rank, p_id FROM point_table ORDER BY points DESC;
更新:您可能还需要考虑在更新点并将其保存到同一表中的其他列时计算排名。这样,你也可以选择一个用户,并知道他的排名。这取决于您的用例,什么更有意义,什么性能更好。
更新:我们在评论中制定的最终解决方案如下:
SELECT
rank, p_id
FROM
(SELECT
@rank:=@rank+1 AS rank, p_id, userid
FROM
point_table, (SELECT @rank := 0) r
ORDER BY points DESC
) t
WHERE userid = intval($sessionuserid);
订购后的行号
SELECT ( @rank:=@rank + 1) AS rank, m.* from
(
SELECT a.p_id, a.userid
FROM (SELECT @rank := 0) r, point_table a
ORDER BY a.points DESC
) m
由于某种原因,接受的答案对我来说不合适——它完全忽略了"ORDER BY";语句,按id(主键)排序
我所做的是:
SET @rn=0;
CREATE TEMPORARY TABLE tmp SELECT * FROM point_table ORDER BY points DESC;
SELECT @rn:=@rn+1 AS rank, tmp.* FROM tmp;
为表中的位置添加一个新列。定期运行cron作业,该作业按点对所有表行进行排序,然后使用while循环中的位置更新表。