PHP中通过sqlsrv调用存储过程——成绩排名去除重复字段的数据行
培训考试项目中,需要实现考试成绩排名:排名参考项为分数(score降序)、参加日期(attendtime升序)、第几次参加考试(frequency升序);并且,每个用户只保留一条数据(pid)。
考试结果存储表格如下:

期望得到的结果为:

解决思路:
- 去重:
- 考虑到dintinct针对单个字段比较有效,结合其他字段使用时,效果不理想;
- 嵌套语句先进行排名,再去除重复的pid数据行;尝试半天没写出来;请教同学,由他给出下一条方案
- 使用临时表,分语句查询;先排名为temp1表,后在temp1表中删除分数小的重复的pid行,再删除考试次数大的重复的pid行,添加rankid字段结合其他字段生成新的temp2临时表;此方法经测试可行,创建为存储过程代码如下:
Create PROCEDURE [dbo].[myZhenxin]
@examid int
AS
BEGIN
if object_id('tempdb..#temp1') is not null
Begin
drop table #temp1
End if object_id('tempdb..#temp2') is not null
Begin
drop table #temp2
End -- Insert statements for procedure here
select id,frequency,attendtime, examid,score,pid into #temp1 from ExamResult where examid=@examid order by score desc,attendtime delete #temp1 where id in(select a.id from #temp1 a, #temp1 b where a.pid = b.pid and a.score<b.score) delete #temp1 where id in(select a.id from #temp1 a, #temp1 b where a.pid = b.pid and a.frequency>b.frequency ) select IDENTITY(int,,) rankid, examid,pid,score,frequency,attendtime into #temp2 from #temp1 select * from #temp2
END
在sql server中,调用存储过程的语句为:
exec myZhenxin ''
在php中使用sqlsrv调用存储过程:
- 直接使用sqlsrv_fetch_array()失败,调试显示没有结果行。
- 找到经验帖I have a Stored Procedure whose result set cannot be fetched by PHP web application.最后一位回答者当中推荐使用sqlsrv_next_result().
- 以下是该帖中该用户提出的解决方案,测试可行;
if ( ($stmt = sqlsrv_query($conn, $tsql)) )
{
// now, iterate through all the statements in
// stored proc or script $tsql:
do
{
// process the result of the iteration
if ( sqlsrv_num_fields($stmt) > 0 )
{
// we have a result set
while ( ($row=sqlsrv_fetch_array($stmt)) )
{
// do something with $row
}
}
else
{
// we have something else
$rowsAffected = sqlsrv_rows_affected($stmt);
}
} while ( ($next = sqlsrv_next_result($stmt)) ) ; if ( $next === NULL )
{
// it worked
}
else
{
// it didn't work, check sqlsrv_errors()
} sqlsrv_free_stmt($stmt);
}
PHP中通过sqlsrv调用存储过程——成绩排名去除重复字段的数据行的更多相关文章
- Oracle之带参存储过程(存储过程中for循环调用存储过程)
--带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...
- oracle中job定时调用存储过程的实例
使用job模拟定时从元数据表中抽取指定数据进入目标表的过程. 一.创建元数据表 --create table test_origianl create table test_original_data ...
- 利用JDBC或者事物或者调用存储过程实现往MySQL插入百万级数据
转自:http://www.cnblogs.com/fnz0/p/5713102.html 想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很 ...
- mysql中去除重复字段-distinct
1.注意事项 使用distinct命令时需要放在查询条件的开头,否则会报错.如果需要查询的项目很多但只针对某一个字段使用distinct的,则可以利用内容拼接的方式来实现. --基本查询 SELECT ...
- MySQL数据库中,使用 group by 时,不重复字段如何拼接显示
就不写文字描述了,直接用图和sql来表述吧. 这是测试数据,表名为 person 现在,我想按照性别进行分组,也就是字段 sex ,同时能将分组后的姓名全部显示出来. sql 语句如下: SELECT ...
- Sybase·调用存储过程并返回结果
最近项目要用Sybase数据库实现分页,第一次使用Sybase数据库,也是第一次使用他的存储过程.2个多小时才调用成功,在此记录: 项目架构:SSM 1.Sybase本身不支持分页操作,需要写存储过程 ...
- 关于 VS 调用存储过程加载很慢和SQL 执行很快的那些事
执行同样的存储过程,调用同样的参数 在VS 中调用存储过程和传参后,到数据加载需要20秒或更多, 在SQL直接调用则不到一秒,同一个存储过程为什么有这么大的区别呢? 原因:存储过程计划失效的原因 产生 ...
- java调用存储过程(stored procedures)的HelloWorld例子
1.java调用存储过程(stored procedures)的HelloWorld程序 有点数据 库基础的人都知道.存储过程(stored procedures)和java没什么关系.它是一段纯粹的 ...
- SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变
前提 本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段 ...
随机推荐
- JS 点击复制按钮 将文字复制到手机剪贴板
我们在制作移动端网页的时候,经常会遇到这样一个问题,如何点击一个"复制"按钮,把一串文字复制到手机剪贴板,如上图所示. 看了网上的一些方法后,感觉那些方法都太复杂,有点要用插件,有 ...
- Java中的static、final关键字
static static 的含义是静态的,是一个静态修饰符,一般来说,被static修饰的有以下几种,类.变量.方法.代码块. static修饰类 Java中普通的类是不允许被声明为静态的,但是有一 ...
- 【基础】Asp.Net操作Cookie总结
一.什么是Cookie? Cookie是存储在客户端文件系统的文本文件或客户端浏览器对话的内存中的少量数据.它主要用来跟踪数据设置,例如:当我们要访问一个网站网页的时候,用户请求网页时,应用程序可能会 ...
- 原生js二级联动
今天说的这个是原生js的二级联动,在空白页面里动态添加并作出相对应的效果. 1 //创建两个下拉列表 select标签 是下拉列表 var sel = document.createElement(& ...
- 【CC2530入门教程-03】CC2530的中断系统及外部中断应用
第3课 CC2530的中断系统及外部中断应用 广东职业技术学院 欧浩源 一.中断相关的基础概念 内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及 ...
- SpringMVC转发和重定向区别!
在servlet中,转发和重定向是由request和response完成的.两者之间的区别请看我之前的文章.那么在springMVC中是如何完成的呢? /**转发**/ @RequestMapping ...
- oracle数据库的编码
--oracle数据库的编码select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';--oracle客户端编 ...
- java 得到uuid并处理
java 得到uuid String s = UUID.randomUUID().toString(); //去掉“-”符号 return s.substring(0,8)+s.substring(9 ...
- 持续集成篇-- SonarQube代码质量管理平台的安装
视频教程:http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 IP:192.168.4.221 环境:CentOS 6 ...
- 【Android Developers Training】 30. 允许其它应用启动你的Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...