经典 ASP - 尝试检索特定值的总数
Classic ASP - Trying to retrieve total count of specific values
我真的希望有人能在这里帮助我。我目前正在使用经典 asp 编码,并且使用 SQL 数据库。
我们有一个支持页面,使用他们的网络登录 ID 将所有访问记录到 sql table。这就是我遇到问题的地方。
我需要显示页面的前 10 个最高访问者和前 10 个使用最少的访问者。因此,例如,如果您在下面看到,这类似于我希望在页面上查看数据的方式:
访客访问
- 约翰 50
- 萨拉 45 岁
- 蒂姆 40
- 杰森 35 岁
- 亚历克斯 30 岁
- 抢 25
- 伊莱恩 20
我这辈子都想不出如何获取此信息。我想要的只是获得所有访问者访问的总数。现在,我们在数据库中有了数据。我只是不知道如何将每个访问者的总数放在页面上,然后从最多访问到最低访问格式化布局。我已经尝试了从网上搜索到这里的所有方法。没有什么能完全满足我使这项工作所需的一切。我什至尝试过使用 count 和 total 的不同方法,但是,唯一成功的查询是总访问量,我只需要按访问者列对其进行细分。有人可以帮助我吗?
更新:
根据回复,我不确定要提供什么代码。我没有任何代码可以提供。我只是想在 asp-classic 中编写一种方法来查询每个值的特定列的总计数。因此,例如,如果姓名 "James" 访问该站点 10 次并且数据库已将他保存 10 次,我想在 asp 上查询该总数。我不知道如何从数据库中获取列中每个名称的计数并获得他们的总访问量。
更新 2:
好的,这就是我尝试 fiddle 使用的代码,基于网络上的其他资源建议:
Set Logs = Connect.Execute ("SELECT COUNT(*) AS VISITOR FROM dbo.Tracking GROUP BY VISITOR
抱歉,MS-SQL 不是 MySQL
我认为你必须将名称分组并在之后计算它们。
Select 按计数 DESC 和 ASC 排序的前 10 个。
SELECT TOP 10 Table1.Visitor, Count(Table1.Visitor) AS Visits
FROM Table1
GROUP BY Table1.Visitor
ORDER BY Count(Table1.Visitor) DESC;
更新 1
MySQL 使用 LIMIT 而不是 TOP (@w3schools):
SELECT Table1.Visitor, Count(Table1.Visitor) AS Visits
FROM Table1
GROUP BY Table1.Visitor
ORDER BY Count(Table1.Visitor) DESC;
LIMIT 10;
因为我没有帮忙...
@kwnwzlnd has 但根据您在问题中所说的内容,您不知道如何将其放入 ASP 页面,这里是一个示例。
先说一点背景知识
开箱即用的经典 ASP 使用脚本语言 VBScript,它在很大程度上依赖于 COM 组件来提供扩展功能,例如与数据库对话。在 VBScript 世界中,促进这一点的库称为 ADO (ActiveX 数据对象) 并且是 MDAC (Microsoft 数据访问组件).
ADODB 提供对允许您对数据库执行复杂操作的对象的访问,这些对象包括 (以及其他);
ADODB.Connection
- 表示与数据源的打开连接。
ADODB.Recordset
- 表示来自基数 table 的整个记录集或执行命令的结果。在任何时候,Recordset 对象仅引用集合中的单个记录作为当前记录。
ADODB.Command
- 定义您打算对数据源执行的特定命令。
一个基本示例
<%
Option Explicit
Dim cmd, sql, conn_str, rs
'Connection String used to connection to the MySQL
'database - see https://www.connectionstrings.com/mysql/
conn_str = "Driver={MySQL ODBC 5.1 Driver};Server=myServerAddress;Database=myDataBase;User=myUsername;Password=myPassword;Option=3;"
sql = ""
sql = sql & "SELECT Table1.Visitor, Count(Table1.Visitor) AS Visits" & vbCrLf
sql = sql & "FROM Table1" & vbCrLf
sql = sql & "GROUP BY Table1.Visitor" & vbCrLf
sql = sql & "ORDER BY Count(Table1.Visitor) DESC;" & vbCrLf
sql = sql & "LIMIT 10;"
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = conn_str
.CommandType = adCmdText 'Named Constant value equals 1
.CommandText = sql
'Execute query and return results to a ADODB.Recordset
Set rs = .Execute()
End With
%>
<ul>
<%
Do While Not rs.EOF
%>
<li><%= rs("Visitor") & " - " & rs("Visits") %></li>
<%
'Move to the next record in the returned Recordset.
Call rs.MoveNext()
Loop
%>
</ul>
<%
'Cleanup after ourselves
Call rs.Close()
Set rs = Nothing
Set cmd = Nothing
%>
提供的代码未经测试
如果我这样做,有些事情我会做不同的事情,这只是一个起点,向前推进肯定会推荐使用 ADODB.Recordset
到 [=62= 的 GetRows()
方法] 记录集的 2D Array
这样您就可以关闭数据库连接并继续使用数据而无需数据库开销。
牢记
即使是这个简单的例子,它也可能会提出更多的问题然后回答。
我只想说谢谢大家的帮助。回答 OP 几天后,我想出了一种方法让您的建议能够满足我的业务需求。我想分享一个例子,说明我在你的帮助下所做的工作。
我在 SQL 中使用了特定的日期格式,并且必须将日期更改为数组才能使这项工作正常进行。我什至能够增加排名!我知道它看起来很业余,但它确实有效。现在我明白它是如何工作的了。再次感谢你的帮助。
下面是示例,以防有人感兴趣(我知道有点晚了,但我想我会分享):
Set Logs = Connect.Execute ("SELECT TOP 20 AnalystID, Count(*) AS N FROM dbo.Analysts WHERE Visits = '" & DateArr(0) & DateArr(2) & "' AND AnalystID <> 'siteadmin1' AND AnalystID <> 'siteadmin2' GROUP BY AnalystID ORDER BY COUNT(*) DESC")
If Logs.eof Then
Else
Do While Not Logs.Eof
iRank = iRank + 1
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open = "Provider=SQLOLEDB;Data Source=" & DatabaseServer & ";Integrated Security=SSPI;Network Library=DBMSSOCN;Initial Catalog=HRDB;"
Set myRecordSetRDR = Con.Execute ("SELECT * FROM dbo.HRDBTBLL With(NoLock) WHERE WDW_LGON_ID = '" & Logs("AnalystID") & "'")
If myRecordSetRDR.EOF Then
Else
strANALYSTFULLNAMEReport = myRecordSetRDR("WKR_FLL_NM")
'response.write myRecordSetRDR("WKR_FLL_NM")
End If
Con.Close ()
If left(Logs("AnalystID"),3) = "NBE" Then
strANALYSTFULLNAMEReport = "N/A"
End If
If left(Logs("AnalystID"),2) = "ZE" Then
strANALYSTFULLNAMEReport = "N/A"
End If
response.write "<tr>"
response.write "<td>"
Response.Write "<center>" & iRank & "</center>"
Response.write "</td>"
response.write "<td>" & formatnumber(Logs("N"),0) & "</td><td>" & Logs("AnalystID") & "</td><td>" & strANALYSTFULLNAMEReport & "</td>"
response.write "</tr>"
Logs.Movenext
Loop
我真的希望有人能在这里帮助我。我目前正在使用经典 asp 编码,并且使用 SQL 数据库。
我们有一个支持页面,使用他们的网络登录 ID 将所有访问记录到 sql table。这就是我遇到问题的地方。
我需要显示页面的前 10 个最高访问者和前 10 个使用最少的访问者。因此,例如,如果您在下面看到,这类似于我希望在页面上查看数据的方式:
访客访问
- 约翰 50
- 萨拉 45 岁
- 蒂姆 40
- 杰森 35 岁
- 亚历克斯 30 岁
- 抢 25
- 伊莱恩 20
我这辈子都想不出如何获取此信息。我想要的只是获得所有访问者访问的总数。现在,我们在数据库中有了数据。我只是不知道如何将每个访问者的总数放在页面上,然后从最多访问到最低访问格式化布局。我已经尝试了从网上搜索到这里的所有方法。没有什么能完全满足我使这项工作所需的一切。我什至尝试过使用 count 和 total 的不同方法,但是,唯一成功的查询是总访问量,我只需要按访问者列对其进行细分。有人可以帮助我吗?
更新:
根据回复,我不确定要提供什么代码。我没有任何代码可以提供。我只是想在 asp-classic 中编写一种方法来查询每个值的特定列的总计数。因此,例如,如果姓名 "James" 访问该站点 10 次并且数据库已将他保存 10 次,我想在 asp 上查询该总数。我不知道如何从数据库中获取列中每个名称的计数并获得他们的总访问量。
更新 2:
好的,这就是我尝试 fiddle 使用的代码,基于网络上的其他资源建议:
Set Logs = Connect.Execute ("SELECT COUNT(*) AS VISITOR FROM dbo.Tracking GROUP BY VISITOR
抱歉,MS-SQL 不是 MySQL
我认为你必须将名称分组并在之后计算它们。 Select 按计数 DESC 和 ASC 排序的前 10 个。
SELECT TOP 10 Table1.Visitor, Count(Table1.Visitor) AS Visits
FROM Table1
GROUP BY Table1.Visitor
ORDER BY Count(Table1.Visitor) DESC;
更新 1
MySQL 使用 LIMIT 而不是 TOP (@w3schools):
SELECT Table1.Visitor, Count(Table1.Visitor) AS Visits
FROM Table1
GROUP BY Table1.Visitor
ORDER BY Count(Table1.Visitor) DESC;
LIMIT 10;
因为我
@kwnwzlnd has
先说一点背景知识
开箱即用的经典 ASP 使用脚本语言 VBScript,它在很大程度上依赖于 COM 组件来提供扩展功能,例如与数据库对话。在 VBScript 世界中,促进这一点的库称为 ADO (ActiveX 数据对象) 并且是 MDAC (Microsoft 数据访问组件).
ADODB 提供对允许您对数据库执行复杂操作的对象的访问,这些对象包括 (以及其他);
ADODB.Connection
- 表示与数据源的打开连接。ADODB.Recordset
- 表示来自基数 table 的整个记录集或执行命令的结果。在任何时候,Recordset 对象仅引用集合中的单个记录作为当前记录。ADODB.Command
- 定义您打算对数据源执行的特定命令。
一个基本示例
<%
Option Explicit
Dim cmd, sql, conn_str, rs
'Connection String used to connection to the MySQL
'database - see https://www.connectionstrings.com/mysql/
conn_str = "Driver={MySQL ODBC 5.1 Driver};Server=myServerAddress;Database=myDataBase;User=myUsername;Password=myPassword;Option=3;"
sql = ""
sql = sql & "SELECT Table1.Visitor, Count(Table1.Visitor) AS Visits" & vbCrLf
sql = sql & "FROM Table1" & vbCrLf
sql = sql & "GROUP BY Table1.Visitor" & vbCrLf
sql = sql & "ORDER BY Count(Table1.Visitor) DESC;" & vbCrLf
sql = sql & "LIMIT 10;"
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = conn_str
.CommandType = adCmdText 'Named Constant value equals 1
.CommandText = sql
'Execute query and return results to a ADODB.Recordset
Set rs = .Execute()
End With
%>
<ul>
<%
Do While Not rs.EOF
%>
<li><%= rs("Visitor") & " - " & rs("Visits") %></li>
<%
'Move to the next record in the returned Recordset.
Call rs.MoveNext()
Loop
%>
</ul>
<%
'Cleanup after ourselves
Call rs.Close()
Set rs = Nothing
Set cmd = Nothing
%>
提供的代码未经测试
如果我这样做,有些事情我会做不同的事情,这只是一个起点,向前推进肯定会推荐使用 ADODB.Recordset
到 [=62= 的 GetRows()
方法] 记录集的 2D Array
这样您就可以关闭数据库连接并继续使用数据而无需数据库开销。
牢记
即使是这个简单的例子,它也可能会提出更多的问题然后回答。
我只想说谢谢大家的帮助。回答 OP 几天后,我想出了一种方法让您的建议能够满足我的业务需求。我想分享一个例子,说明我在你的帮助下所做的工作。
我在 SQL 中使用了特定的日期格式,并且必须将日期更改为数组才能使这项工作正常进行。我什至能够增加排名!我知道它看起来很业余,但它确实有效。现在我明白它是如何工作的了。再次感谢你的帮助。
下面是示例,以防有人感兴趣(我知道有点晚了,但我想我会分享):
Set Logs = Connect.Execute ("SELECT TOP 20 AnalystID, Count(*) AS N FROM dbo.Analysts WHERE Visits = '" & DateArr(0) & DateArr(2) & "' AND AnalystID <> 'siteadmin1' AND AnalystID <> 'siteadmin2' GROUP BY AnalystID ORDER BY COUNT(*) DESC")
If Logs.eof Then
Else
Do While Not Logs.Eof
iRank = iRank + 1
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open = "Provider=SQLOLEDB;Data Source=" & DatabaseServer & ";Integrated Security=SSPI;Network Library=DBMSSOCN;Initial Catalog=HRDB;"
Set myRecordSetRDR = Con.Execute ("SELECT * FROM dbo.HRDBTBLL With(NoLock) WHERE WDW_LGON_ID = '" & Logs("AnalystID") & "'")
If myRecordSetRDR.EOF Then
Else
strANALYSTFULLNAMEReport = myRecordSetRDR("WKR_FLL_NM")
'response.write myRecordSetRDR("WKR_FLL_NM")
End If
Con.Close ()
If left(Logs("AnalystID"),3) = "NBE" Then
strANALYSTFULLNAMEReport = "N/A"
End If
If left(Logs("AnalystID"),2) = "ZE" Then
strANALYSTFULLNAMEReport = "N/A"
End If
response.write "<tr>"
response.write "<td>"
Response.Write "<center>" & iRank & "</center>"
Response.write "</td>"
response.write "<td>" & formatnumber(Logs("N"),0) & "</td><td>" & Logs("AnalystID") & "</td><td>" & strANALYSTFULLNAMEReport & "</td>"
response.write "</tr>"
Logs.Movenext
Loop