`
yesjavame
  • 浏览: 688483 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

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

test

ID

ClassName

title

1

a

a1

2

b

b1

3

a

a2

4

a

a3

5

b

b2

6

c

c1

7

c

c2

8

c

c3

9

a

a4

10

b

b3

11

d

d1

12

a

a5

13

c

c4

14

b

b4

(一) 通过一个变量控制输出

代码如下:

<%@Language=VBScript CodePage=936%>

<%

Option Explicit

dim conn,rs,currentClassname

<place w:st="on"><city w:st="on"><span lang="EN-US">Set</span></city><span lang="EN-US"> <state w:st="on">Conn</state></span></place>=Server.CreateObject("ADODB.Connection")

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

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

该方法要点有两个:

1、 查询语句。

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

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

2、 循环控制变量。

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

(二) 通过ADOShape命令查询结果。

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

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

成形的 Recordset 可以由如下类型的列组成:

列类型

说明

数据

由对数据提供者、表或以前成形 Recordset 使用查询命令所返回的 Recordset 的字段。

子集

对另一个 Recordset 的引用,称为子集。子集列使定义-关系成为可能,在这种关系中是包含子集列的 Recordset是由子集代表的 Recordset

合计

列的值通过对所有行执行合计函数获得,或者是子 Recordset 的所有行的列。(请参阅下表中的合计函数。)

计算表达式

列的值通过对在 Recordset 的相同行中的列进行 Visual Basic for Applications 表达式的计算而获得。表达式是 CALC 函数的参数。(请参阅下表中的计算表达式。)

新建

空的、虚构的字段,可在随后充填数据。列使用 NEW 关键字定义。(请参阅下表中的 NEW 关键字。)

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

合计函数

说明

SUM(chapter-alias.column-name)

计算指定列中所有值的和。

AVG(chapter-alias.column-name)

计算指定列中所有值的平均值。

MAX(chapter-alias.column-name)

计算指定列中的最大值。

MIN(chapter-alias.column-name)

计算指定列中的最小值。

COUNT(chapter-alias[.column-name])

计算指定别名或列中行的数量。

STDEV(chapter-alias.column-name)

计算指定列中的标准偏差。

ANY(chapter-alias.column-name)

列的值(列的值在所有行均相同)。

计算表达式

说明

CALC(expression)

计算任意表达式,但仅针对包含 CALC 函数的 Recordset 行。可以是任何 Visual Basic for Applications (VBA) 函数或表达式。

NEW 关键字

说明

NEW (field type [(width | scale [,precision])]

将指定类型的空列添加到 Recordset

然后我们可以写出如下代码:

<%@Language=VBScript CodePage=936%>

<%

Option Explicit

dim conn,rs,rschapClassname

<place w:st="on"><city w:st="on"><span lang="EN-US">Set</span></city><span lang="EN-US"> <state w:st="on">Conn</state></span></place>=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

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

1、 数据库联接

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

2、 查询结构

我们看看以下查询语句:

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”访问该记录集进行输出。

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

呵呵,不好意思,因为我没做过详细的测试,所以不知道那个最好。大家可以根据各自情况选择其中的一种办法,或许可能还有更好的办法是我没想到的。

分享到:
评论

相关推荐

    自动生成数据块 用现成统计数据类型

    在我们的场景中,Task 1负责生成两种类型的数据块,这暗示我们可能需要创建两种不同的数据结构或格式来容纳这两种数据。 数据块的结构描述至关重要,因为它定义了数据的组织方式和含义。结构可能包括以下元素: 1. ...

    Access数据库导出数据到Excel.zip

    Access数据库导出数据到Excel是一种常见的数据交换方式,适用于数据预处理、分析或与不使用Access的同事分享数据。这个过程涉及到Access的基本操作和Excel的功能利用,对于IT专业人士来说,掌握这项技能对于提升工作...

    ASP.NET-[其他类别]数据导入与数据导出Excel.zip

    在ASP.NET开发中,数据导入和导出是常见的需求,特别是在数据分析、报表生成以及数据交换等场景中。本文将深入探讨如何在ASP.NET环境中实现数据的导入与导出到Excel文件,以满足业务需求。 首先,我们要理解Excel...

    数据降维方法

    本文将深入探讨两种常用的数据降维方法:主成分分析(PCA)和线性判别分析(LDA),并结合代码实例进行讲解。 **主成分分析(PCA)** PCA是一种无监督学习方法,它通过线性变换将原始高维数据转换为一组各维度线性...

    不平衡数据多分类数据集.rar

    ".data"和"csvg"是两种数据文件格式。".data"通常用于存储结构化的数据,可以被许多编程语言的库读取。".csvg"可能指的是CSV(Comma Separated Values)格式,这是一种通用的数据交换格式,易于人类阅读,也便于程序...

    KNN算法的c++两种实现,内涵两个版本的代码工程,数据集为iris,vs2013可用

    本资源提供的是KNN算法在C++语言中的两种实现方式,适用于Visual Studio 2013开发环境,并以鸢尾花(Iris)数据集作为示例。 鸢尾花数据集是机器学习领域经典的数据集,包含了三种不同鸢尾花的花瓣长度、宽度、萼片...

    基于GRNN广义回归神经网络的数据分类和基于FCM数据分类对比并输出混淆矩阵评价指标-源码

    本文将深入探讨两种数据分类方法:GRNN(广义回归神经网络)和FCM(模糊C均值聚类),以及如何通过混淆矩阵来评估它们的性能。 GRNN(广义回归神经网络)是一种基于径向基函数的神经网络模型,它在预测和分类问题上...

    ArcGIS按属性字段分离输出图层

    3. **设置输出格式**:你可以选择将结果输出为.shp文件(Shapefile),这是一种常见的矢量数据格式,适合存储地理图形和其属性信息。另外,你还可以选择输出为.gdb要素类,这是File Geodatabase中的一个数据结构,它...

    数据挖掘技术方法的研究.pdf

    粗糙集理论试图创建一个数据库中描述的复杂世界的简单模型,因而数据挖掘也可以被看作是处理大量信息的方法,并且它有助于以比人更快的速度发现有用的信息。 数据挖掘在不同的应用领域中具有广泛的应用前景,它的...

    ASP.NET-[其他类别]仿Google查询并导出Excel源码.zip

    - ASP.NET MVC或Web Forms:项目可能使用了这两种ASP.NET技术之一来构建前端界面和后端逻辑。MVC模式提供了更好的分离关注点,而Web Forms则更侧重于事件驱动的编程模型。 - 搜索接口:用户界面会包含一个输入框,...

    多标签数据集.zip

    在MATLAB和Python中,可以直接使用这个数据集,这意味着它已经预处理好,格式适合这两种编程语言的读取和处理,省去了开发者预处理数据的步骤。 "emotions数据集"则是另一个多标签数据集,它关注的是情感分析。此...

    线阵CCD测距系统的类别方差法数据处理.pdf

    文章中提到了两种主要的数据处理方法: 1. 均值阈值法:通过设定阈值,将信号分为两类,以此简化数据处理过程。 2. 类别方差法:通过分析数据的类别方差来确定光斑的位置,从而提高测量精度。 通过对比研究,实验...

    机器学习-贷款违约行为预测(基于逻辑回归和朴素贝叶斯和随机森林及SVM四种方法实现,资源包含完成则代码及数据,数据3万余条记录

    在贷款违约预测中,逻辑回归通过构建一个概率模型,输出贷款者违约的可能性。它假设因变量与自变量之间存在线性关系,然后通过sigmoid函数将结果映射到(0,1)之间,表示违约概率。优点是计算简单,易于理解和解释,但...

    机器学习两种方法——监督学习和无监督学习(通俗理解).pdf

    监督学习和无监督学习是机器学习中的两种主要方法,它们各有特点,应用场景也有所不同。 监督学习是一种有标签的学习方式,它需要一个带有正确答案(标签)的训练数据集。在监督学习中,算法的目标是从训练数据中...

    数据挖掘中的组合分类方法研究.pdf

    ID3和C4.5算法是目前两种非常重要的决策树算法,它们通过各自的优势解决数据分类问题。随着技术的发展,结合其他算法如遗传算法来提高分类精度的组合分类方法,将成为数据挖掘领域的重要研究方向。通过这些研究,...

    毕设新项目-基于YOLOv7实现露天停车场车位检测计数(占用与空置两种)系统源码(包含数据集+模型+评估指标曲线).zip

    毕设新项目-基于YOLOv7实现露天停车场车位检测(占用与空置两种)系统源码(包含数据集+模型+评估指标曲线).zip 【资源项目介绍】 1、该项目是毕业设计新项目,是对露天停车场车位进行识别检测,类别分为两类,分别是...

    中医诊断模型构建中的两种常用数据挖掘分类技术.pdf

    在本篇文档中,将重点讨论两种常用的分类技术——决策树和神经网络,并分析它们在中医诊断模型构建中的应用,优势与不足。 首先,决策树作为一种归纳学习算法,能够从无次序、无规律的实例中推理出分类规则,并以...

    oracle数据仓库中三种优化

    - **复合分区** (Composite Partitioning): 结合使用两种分区方法,先按一种方式进行分区,再对每个分区使用另一种方式进行子分区。 **3. 示例** - **范围分区**: ```sql CREATE TABLE T_LOGNODE_RECORD ( ...

    数据挖掘原理与算法05聚类方法.ppt

    "数据挖掘原理与算法05聚类方法" 数据挖掘领域中的聚类方法是指根据数据对象之间的相似度或相异度,...聚类方法是数据挖掘领域中的一种重要的数据分析手段,可以用于数据预处理、特征抽取、数据分类和数据挖掘等领域。

Global site tag (gtag.js) - Google Analytics