站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题请问该怎样解决这样的排名问题?

请问该怎样解决这样的排名问题?

摘要: 请问该怎样解决这样的排名问题?


在数据库里面已经有相应的数据,分别是品德、学业、文体三方面的总分,我想从数据库里取出来,计算出各个同学的排名,再更新库里头的三项paiming字段,这些将来是要在一张表显示出来的。代码如下:
<%
sqlmaster="SELECT * FROM master WHERE classNumber="+session.getAttribute("ClassNumber")+"";
rsmaster=stmt.executeQuery(sqlmaster);
while(rsmaster.next()){
renshu=rsmaster.getInt(4);
}
double[] a=new double[renshu];//存储品德总分
double[] b=new double[renshu];//存储学业总分
double[] c=new double[renshu];//存储文体总分
double[] d=new double[renshu];//存储三项总分
String[] upp=new String[renshu];//存储更新品德排名语句
String[] upx=new String[renshu];//存储更新学业排名语句
String[] upw=new String[renshu];//存储更新文体排名语句
String[] upc=new String[renshu];//存储更新总分语句
sqluser1="SELECT * FROM user WHERE classNumber="+session.getAttribute("ClassNumber")+" AND number like '"+"%"+session.getAttribute("YearTwo")+"'";
rsuser1=stmt.executeQuery(sqluser1);
while(rsuser1.next()){
for(int i=0;ia[i++]=rsuser1.getDouble(12);
}
for(int i=0;ib[i++]=rsuser1.getDouble(17);
}
for(int i=0;ic[i++]=rsuser1.getDouble(22);
}
for(int i=0;id[i++]=rsuser1.getgetDouble(12)+rsuser1.getDouble(17)+rsuser1.getDouble(22);
}
}
Arrays.sort(a);
Arrays.sort(b);
Arrays.sort(c);
sqluser2="SELECT * FROM user WHERE classNumber="+session.getAttribute("ClassNumber")+" AND number like '"+"%"+session.getAttribute("YearTwo")+"'";
rsuser2=stmt.executeQuery(sqluser2);
while(rsuser2.next()){
for(int i=0;iif(rsuser2.getDouble(12)==a[i]){
int ppaiming=a.length-i;
upp[i++]="UPDATE user SET ppaiming="+ppaiming+" WHERE classNumber="+session.getAttribute("ClassNumber")+" AND number like '"+"%"+session.getAttribute("YearTwo")+"'";
}
}
for(int i=0;iif(rsuser2.getDouble(17)==b[i]){
int xpaiming=b.length-i;
upx[i++]="UPDATE user SET xpaiming="+xpaiming+" WHERE classNumber="+session.getAttribute("ClassNumber")+" AND number like '"+"%"+session.getAttribute("YearTwo")+"'";
}
}
for(int i=0;iif(rsuser2.getDouble(22)==c[i]){
int wpaiming=c.length-i;
upw[i++]="UPDATE user SET wpaiming="+wpaiming+" WHERE classNumber="+session.getAttribute("ClassNumber")+" AND number like '"+"%"+session.getAttribute("YearTwo")+"'";
}
}
for(int i=0;iupc[i++]="UPDATE user SET cepingtotal="+d[i++]+" WHERE classNumber="+session.getAttribute("ClassNumber")+" AND number like '"+"%"+session.getAttribute("YearTwo")+"'";
}
}
for(int i=0;istmt.executeUpdate(upp[i]);
stmt.executeUpdate(upx[i]);
stmt.executeUpdate(upw[i]);
stmt.executeUpdate(upc[i]);
}
请问这样子有问题吗?不过这样并没有考虑到分数相同的情况,请大侠指点!


你不会用Sum等分组统计函数吗?


你应该把表的结构说一下吧.要不然有点难猜测哦


user表里面有number(学生学号),birthday,className(班级名),name,sex,minzu,mianmao,classNumber,pjtotal,pftotal,pktotal,pzhesuan(品德折算),ppaiming(品德排名,通过品德折算来排),xjtotal,xftotal,xktotal,xzhesuan(学业折算),xpaiming,wjtotal,wftotal,wktotal,wzhesuan(问题折算),wpaiming,cepingzongfen(测评总分),totalpaiming,caozuo


统计函数?好像很好用的样子,只是没听过啊,不会用


可以把你的数据库表的代码和基础数据给我吗?我在Oracle中测试一下,我重新建表太麻烦了.


select rownum from (select * from uesr
order by 品德分;)这样就能按品德分把名次排出来,这个rownum刚好的记录的号码也就是排名


我用Access建的数据库啊,直接在界面操作的,没有代码啊,基础数据也还没录入。主要是想请教一下遇到分数相同的时候,排名要怎样处理。比如两个人并列第二,那下一个人肯定是第四了,不知道怎么实现


那 我没办法了


晕啊,救命啊~~~


wlai jiu ni


嗯,怎么救?


String str[]={"pzhesuan","xzhesuan","wzhesuan"};
String sql="select rownum,number,? from user order by ?";
String sqlTemp = "select number form user";

HashMap map = new HashMap();

PreparedStatement pstat = conn.preparedStatement(sqlTemp);
ResultSet rs = pstat.executeQuery();
while(rs.next())
{
map.add(rs.getString(1),new int[3]);//用学号对应三个排名的形式.一个学号对应一个int[3]
}

int pai=-1;//排名
int rownum=-1; //记录编号
double fen1=-1; //用来记录前一条记录的分数
double fenShu=-1; //当前记录的分数

String number=null; //学号的字符形式

/*
分别按三个分类去找排名
*/
for(int i=0;i< str.length;i++)
{
pstat = conn.preparedStatement(sql);
pstat.setString(1,str[i]);
pstat.setString(2,str[i]);

rs = pstat.executeQuery();//执行查询

while(rs.next())
{
rownum=rs.getInt(1);//取得记录号
number=rs.getString(2); //取得学号的字符形式
fenShu=rs.getDouble(3); //取得当前记录的分数

/*double的比较方法,如果两个分数不一样,表示排名要变成当前的记录号,fen1也变成这个分数*/
if( Math.abs(fenShu - fen1)>0.01)
{
pai=rownum;//前后两个分数不一样了,排名就变成记录编号了
fen1=fenShu;//设置为当前
}
((int [])map.get(number))[i]=pai;//取得此学号的对应的排名数组,并设置对应的值
}
}

String update="update user set ppaiming=?,xpaiming=?,wpaiming=? where number=?";

Iterator it = map.keySet().iterator();//map.keySet()得到学号的集合

pstat = conn.preparedStatement(update);//更新排名

while(it.hasNest())
{
String tempNumber=(String)it.next();//学号的字符形式

int number=Integer.parseInt(tempNumber);//学号转换成数字

int paiming[]=(int[])map.get(tempNumber);//得到某个学号的排名数组

pstat.setInt(1,paiming[0]);
pstat.setInt(2,paiming[1]);
pstat.setInt(3,paiming[2]);
pstat.setInt(4,number);

pstat.executeUpdate();//全新数据库
}


where条件我没有写进去.
我这里的rownum可能是专门针对Oracle的,因为我的Oracle不能用了,所有我没有验证,明天我去学校了再验证一下,在Access好像有一个rowid和它是对应的吧.


晕,看不太懂,不管怎么说,先给分。不过要怎样给的啊?问我是否要结贴,结了贴会怎样的?


我上面那个代码有问题吗?我把“if(rsuser2.getDouble(12)==a[i]){ ”对应的那三行改成
“if(rsuser2.getDouble(12)>=a[i]){ ”了


好像是在管理的吧,我也没有发过问题,你试试


贴还是在这里啊.就是你 的可用分数会减少了的吧


你的代码可能不行
while(rsuser1.next()){
for(int i=0;ia[i++]=rsuser1.getDouble(12);
}

就看这里的吧,本来一次循环(while)只有一条记录,但是你这时候却想得到所有人的品德分是不行的吧?一条记录里只有一个人的分数.
int i=0
while(rsuser1.next()){
a[i]=rsuser1.getDouble(12);
b[i]=rsuser1.getDouble(17);
c[i]=rsuser1.getDouble(22);
d[i++]=rsuser1.getgetDouble(12)+rsuser1.getDouble(17)+rsuser1.getDouble(22);
}
这一部分改成这样应该就可以了.


晕,老是说什么帖子回复次数大于给分次数


可能是我回复多了,应该只给一个回贴分吧


行了,谢谢你哈,等有了数据再测试一下,不懂的地方再来请教您。不过,我可不可以加你QQ?以后可能要麻烦你,如果不方便也没什么哈,谢谢你了!


我给你发短消息了.你看看

测试的时候发现rownum并没有实现我想要的功能,但也正好发现了,不需要它了,在程序里写一个变量就行了.也不用管Access是否有rowid的了
数据库代码:
create table userX(n number(5),c1 number(4,2),c2 number(4,2),c3 number(4,2),p1 number(5),p2 number(5),
p3 number(5));
n为学号,c1,c2,c3表示三门成绩;
p1,p2,p3表成三门成绩的排名;
初始化数据:
insert into userX values(1,80,54,80,-1,-1,-1);
insert into userX values(2,90,43,90,-1,-1,-1);
insert into userX values(3,91,65,80,-1,-1,-1);
insert into userX values(4,75,87,98,-1,-1,-1);
insert into userX values(5,65,87,87,-1,-1,-1);
insert into userX values(6,80,54,78,-1,-1,-1);
insert into userX values(7,90,54,78,-1,-1,-1);
insert into userX values(8,65,65,86,-1,-1,-1);
insert into userX values(9,81,50,84,-1,-1,-1);
insert into userX values(10,45,98,54,-1,-1,-1);
insert into userX values(11,95,70,54,-1,-1,-1);
insert into userX values(12,87,60,65,-1,-1,-1);
insert into userX values(13,65,70,65,-1,-1,-1);
commit;
程序的代码:

String str[]={"c1","c2","c3"};
String sqlTemp = "select n from userX";

HashMap map = new HashMap();

PreparedStatement pstat = conn.prepareStatement(sqlTemp);

ResultSet rs = pstat.executeQuery();
while(rs.next())
{
map.put(rs.getString(1),new int[3]);//用学号对应三个排名的形式.一个学号对应一个int[3]
}

int pai=-1;//排名
int rownum=-1; //记录编号
double fen1=0; //用来记录前一条记录的分数
double fenShu=-1; //当前记录的分数

int number=-1; //学号的字符形式
/*
分别按三个分类去找排名
*/
for(int i=0;i< str.length;i++)
{
pai=0;//排名
rownum=0; //记录编号
fen1=-1; //用来记录前一条记录的分数
fenShu=-1; //当前记录的分数
number=-1; //学号的字符形式
pstat = conn.prepareStatement("select n,"+str[i]+" from userX order by " +str[i] + " desc");
rs = pstat.executeQuery();//执行查询

while(rs.next())
{
rownum++; //记录数加1
number=rs.getInt(1); //取得学号
fenShu=rs.getDouble(2); //取得当前记录的分数
System.out.print(number+"/t");
System.out.println(fenShu);
/*double的比较方法,如果两个分数不一样,表示排名要变成当前的记录号,fen1也变成这个分数*/
if( Math.abs(fenShu - fen1)>0.01)
{
pai=rownum;//前后两个分数不一样了,排名就变成记录数了
fen1=fenShu;//设置为当前
}
((int [])map.get(String.valueOf(number)))[i]=pai;//取得此学号的对应的排名数组,并设置对应的值
}
}

String update="update userX set p1=?,p2=?,p3=? where n=?";

Iterator it = map.keySet().iterator();//map.keySet()得到学号的集合

pstat = conn.prepareStatement(update);//更新排名

while(it.hasNext())
{
String tempNumber=(String)it.next();//学号的字符形式

number=Integer.parseInt(tempNumber);//学号
int paiming[]=(int[])map.get(tempNumber);//得到某个学号的排名数组

pstat.setInt(1,paiming[0]);
pstat.setInt(2,paiming[1]);
pstat.setInt(3,paiming[2]);
pstat.setInt(4,number);
pstat.executeUpdate();//全新数据库
}


↑返回目录
前一篇: 菜鸟求,数据统计判断问题,100分,急~~~~!
后一篇: 有关request.getSession参数(true或者false)的含义