经过一次查询按类别输出数据的两种方法

常常在论坛上碰到一些新学ASP开发的朋友咨询如何经过查询按类别输出数据,而一般用的方法是先查询出各种别,而后经过循环一个一个的再查询出该类别的数据输出。这个办法是最简单的,可是也是比较耗费资源和效率比较低的。下面我介绍两个方法,都是只查询一次就能够输出的,但愿对你们有所帮助。数据库

本例子所使用的数据库结构以下:ide

(一) 经过一个变量控制输出函数

代码以下:oop

<%@Language=VBScript CodePage=936%> 测试

<% 字体

Option Explicit code

dim conn,rs,currentClassname 对象

Set Conn=Server.CreateObject("ADODB.Connection") 排序

conn.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq= test.mdb;" ip

set rs=conn.execute("select id,classname,title from test order by classname,title")

currentClassname=""

do while not rs.eof

if currentClassname<>rs("classname") then 

          if currentClassname="" then   

                 response.write  "<table>" & vbcrlf  

          else 

                 response.write "</table><br /><table>" & vbcrlf  

          end if  

          currentClassname=rs("classname")  

          response.write "<tr><td align='center' style='font-weight:bold;'>"&currentClassname&"</td></tr>"& vbcrlf  

   end if  

   response.write "<tr><td><a href='test.asp?id="&rs("id")&"'>"&rs("title")&"</a></td></tr>"& vbcrlf  

   rs.movenext

loop

response.write "</table>"& vbcrlf

%>

rs.close

set rs=nothing

conn.close

set conn=nothing

该方法要点有两个:

一、 查询语句。

咱们看看这个查询语句:select id,classname,title from test order by classname,title

红色字体部分就是要注意的,只有排序方式是先按类别排序的,咱们才能得出咱们须要的效果。

二、 循环控制变量。

从代码中,咱们能够看到currentClassname这个变量记录了当前的类别名称,当该名称发生该表的时候,也就意味着上一类别已经输出完成,须要更改咱们的显示了。

(二) 经过ADO的Shape命令查询结果。

咱们先看看Shape命令在ADO中的说明:

“数据构形”定义了成形 Recordset 的列、由列表明的条目之间的关系以及数据充填到 Recordset 的方式。

成形的 Recordset 能够由以下类型的列组成:

Shape 命令能够包含子句,指定针对基本数据提供者并将返回 Recordset 对象的查询命令。查询的语法取决于对基本数据提供者的要求。虽然 ADO 并不要求使用任何指定的查询语言,但一般是使用结构化查询语言 (SQL)。

您可使用 SQL JOIN 子句关联两个表,可是,分级 Recordset 能够更有效地表达信息。由 JOIN 建立的 Recordset 的每行会多余地重复一个表中的信息。分级 Recordset 的多个子 Recordset 对象中,每一个对象仅有一个父 Recordset。

Shape 命令能够仅由 Recordset 对象发出。

Shape 命令能够嵌套,即父命令或子命令自己能够是另外一个 Shape 命令。

有关定位分级 Recordset 的详细信息,请参阅访问分级 Recordset 中的行。

有关语法正确的 Shape 命令的详细信息,请参阅形状语法格式。

合计函数、CALC 函数和 NEW 关键字

数据构形支持以下函数。chapter-alias 是指定给包含了将被操做列的子集名称。

chapter-alias(子集-别名)能够是完整的,由指向包含 column-name 的子集的每一个子集列名称组成,所有用句号分隔。例如,若是父子集 chap1 包含拥有数量列 amt 的子子集,则完整名便是 chap1.chap2.amt。

而后咱们能够写出以下代码:

<%@Language=VBScript CodePage=936%>

<%

Option Explicit

dim conn,rs,rschapClassname

Set Conn=Server.CreateObject("ADODB.Connection")

conn.Open "Provider=MSDataShape;Data Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};Dbq=D:/projects/homepage/test/sample1/test.mdb;"

set rs=conn.execute( "SHAPE {select DISTINCT classname from test order by classname }" & vbcrlf & _

"APPEND ({select id,title,classname from test} " & vbcrlf & _  

   "RELATE classname TO classname) AS chapClassname")

do while not rs.eof

response.write "<table>" & vbcrlf & _  

          "<tr><td align='center' style='font-weight:bold;'>"&rs("classname")&"</td></tr>"& vbcrlf  

   set rschapClassname=rs("chapClassname").value  

   do while not rschapClassname.eof  

          response.write "<tr><td><a href='test.asp?id="&rschapClassname("id")&"'>"&rschapClassname("title")&"</a></td></tr>"& vbcrlf  

          rschapClassname.movenext  

   loop  

   response.write "</table>" & vbcrlf  

   rs.movenext

loop

rschapClassname.close

set rschapClassname=nothing

rs.close

set rs=nothing

conn.close

set conn=nothing

在以上代码中咱们要注意的有点:

一、 数据库联接

Shape命令构型必定要在数据库链接的字符串中加入Provider=MSDataShape;Data Provider=MSDASQL;,否则是不能用过shape进行查询的。

二、 查询结构

咱们看看如下查询语句:

SHAPE {select DISTINCT classname from test order by classname }

APPEND ({select id,title,classname from test} RELATE classname TO classname) AS chapClassname

首先是查询出主要类别:{select DISTINCT classname from test order by classname }

而后经过APPEND将该类型的全部记录做为一个记录集追加到主查询,做为主查询的一个字段,而后经过“set rschapClassname=rs("chapClassname").value”访问该记录集进行输出。

看过的朋友必定会问:“这两个方法哪一个方法最好?”

呵呵,很差意思,由于我没作过详细的测试,因此不知道那个最好。你们能够根据各自状况选择其中的一种办法,或许可能还有更好的办法是我没想到的。

相关文章
相关标签/搜索