Classic ASP配合MS SQL 2005如何按类别拆分查询结果且最新在前
现有代码存在的核心问题
你当前编写的SQL会完全无法返回结果,主要有两个硬错误:
- 语法不闭合:字符串
'test1末尾少了闭合的单引号 - 逻辑错误:同一字段不可能同时满足两个等值判断,
where Category='test1' and Category='test2'是永假条件,永远查不到数据
要正确获取test1、test2两个类别的全部记录,且按ID倒序(最新记录优先)排序,基础正确SQL写法为:SELECT ID, Data1, Data2, Category FROM 你的表名 WHERE Category IN ('test1','test2') ORDER BY Category, ID DESC
说明:这个排序规则会把同类别记录集中排列,且类别内部按ID从大到小排,满足最新记录在前的要求。
按类别拆分到页面不同位置的实现方法
Classic ASP默认使用仅向前游标打开记录集,记录集完整遍历一遍后指针就会移到末尾,没法重复遍历两次分别给两个类别区块用,因此有两种成熟的实现方案:
方案1:单次查询+内存分流(性能最优)
这是老Classic ASP项目里最常用的实现方式,只和数据库交互一次拿到全部目标记录,遍历记录集时按类别把数据存到独立的数组里,最后在页面对应位置循环数组输出即可,能减少数据库连接的开销。
- 打开上面写的SQL得到记录集后,先初始化和记录集大小匹配的两个数组,循环读记录集的时候按类别分流存储:
Dim test1Arr(), test2Arr(), t1Count, t2Count, totalCount t1Count = 0 t2Count = 0 totalCount = rs.RecordCount ' 数组维度: 行索引, 列(存ID、Data1、Data2三个字段) ReDim test1Arr(totalCount - 1, 2) ReDim test2Arr(totalCount - 1, 2) Do While Not rs.EOF If rs("Category") = "test1" Then test1Arr(t1Count, 0) = rs("ID") test1Arr(t1Count, 1) = rs("Data1") test1Arr(t1Count, 2) = rs("Data2") t1Count = t1Count + 1 ElseIf rs("Category") = "test2" Then test2Arr(t2Count, 0) = rs("ID") test2Arr(t2Count, 1) = rs("Data1") test2Arr(t2Count, 2) = rs("Data2") t2Count = t2Count + 1 End If rs.MoveNext Loop rs.Close ' 读完立刻关闭记录集释放资源 - 在页面需要展示test1的位置,循环test1Arr数组输出内容;在需要展示test2的位置,循环test2Arr数组输出内容:
<!-- test1 类别展示区块 --> <div class="cat-block cat-test1"> <h3>test1 类别记录</h3> <% For i = 0 To t1Count - 1 %> <div class="record-item"> ID:<%= test1Arr(i, 0) %> 字段1:<%= test1Arr(i, 1) %> 字段2:<%= test1Arr(i, 2) %> </div> <% Next %> </div> <!-- test2 类别展示区块 --> <div class="cat-block cat-test2"> <h3>test2 类别记录</h3> <% For i = 0 To t2Count - 1 %> <div class="record-item"> ID:<%= test2Arr(i, 0) %> 字段1:<%= test2Arr(i, 1) %> 字段2:<%= test2Arr(i, 2) %> </div> <% Next %> </div>
方案2:独立双查询(实现简单)
如果觉得数组分流的逻辑繁琐,也可以针对每个类别写单独的查询语句,在页面对应区块位置直接执行查询、循环输出,逻辑更直白。缺点是需要两次和数据库交互,数据量较大时性能不如方案1:
' 页面test1区块位置 sqlTest1 = "SELECT ID, Data1, Data2 FROM 你的表名 WHERE Category='test1' ORDER BY ID DESC" ' 执行查询得到rsTest1,循环输出记录内容 ' 页面test2区块位置 sqlTest2 = "SELECT ID, Data1, Data2 FROM 你的表名 WHERE Category='test2' ORDER BY ID DESC" ' 执行查询得到rsTest2,循环输出记录内容
常见避坑提醒
- 查询多个类别的记录时,不要用
and连接类别条件,要用in或者or,否则会出现无结果的问题 - 拼接SQL字符串时注意检查单引号的闭合,避免触发语法错误
- 如果单类别记录量超过1000条,不建议用数组把所有数据读进内存,优先选择独立双查询的方案减少内存占用
内容的提问来源于stack exchange,提问作者Babar
相关产品推荐
相关产品推荐

