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就行了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)