mysql数据库中数据的排名问题

mysql数据库中数据的排名问题,第1张

这个如果想要性能的话,就用下面的sql语句实现:

select orderNo from (select (@rowNum:=@rowNum+1) orderNo , userid ,pid from TABLE,(Select (@rowNum :=0) ) b )t where t.userid=2694

然后php获得这条结果数组,取第一个元素即是排序

如果对这个sql语句有疑问,不明白,可以使用一个比较耗费性能的方法:

select userid from record

执行这条语句,获得一个数组$res

遍历前设置一个记录排序的标识 $seq=1

for(...){

$userid=$res['userid']//把第seq 个位置的学号拿出来,跟想要的学号比

if($userid==2694){

break

}

$seq++

}

//如果 这个排序标识比结果集数组大小还大,说明没这个userid的记录。

$seq就是排序

我没有测试 你可以自己试一下

建议你用程序来完成。这个涉及计算列排序,排序的多重方式,各个数据库估计写法都不同。

---

如果你硬要用sql完成可以用如下方式:

记住只在mysql里能这么写。幸好你的是mysql

---------

SELECT M.class,M.AvgS,M.pm

FROM

(

SELECT A.*,@rank:=@rank+1 as pm

FROM

(

SELECT class,avg(score) as AvgS FROM test.chengji GROUP BY class ORDER BY AvgS DESC

) A ,(SELECT @rank:=0) B

) M

ORDER BY M.class

--------

pm 代表排名

---

结果类似:

class AvgSpm

-----------------------

'1', '47.0000', '1'

'2', '12.0000', '3'

'5', '38.5000', '2'

------------------------

其实你可以这样

1.选一个特定时间(一般是周一凌晨,这个不重要,以为统计之前,大家的score变化时同等机会的,),从score所在的表中select出所有好友的分数,外按score从大到小排。

2.讲上面选出的内容,按顺序插到另一个表中(关系到你的排名)。比如TempScoreLastWeek[ID,好友ID,统计时间]

3.这样。。你就可以为所欲为了,比如什么上周排名了。上上周排名了。你还能加sorce到TempScoreLastWeek表中,你按年排名都没问题。

*如果只要上周,那么在统计之前,清空TempScoreLastWeek就行了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9933961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存