【问题标题】:SQL: Showing a Link Option Using ConditionsSQL:使用条件显示链接选项
【发布时间】:2024-01-05 13:48:02
【问题描述】:

我正在尝试根据使用 2 个表格的条件为用户提供菜单选项。

我们有一个针对不同城镇的目录网站,每个城镇管理员都可以将子类别添加到主要类别以自定义其目录结构,但目前允许他们将子类别添加到已经填充了广告的更多子类别 - 这它不应该这样做。

我只想在没有添加广告的情况下向另一个子类别显示“添加子类别”选项。

例如,在所有城镇目录中都有一个名为“会计师”的子类别。它在“Brentwood”目录中填充了客户广告,但不在“Shrewsbury”目录中。

如果使用下表和列中的数据满足以下三个条件,我只想显示“添加子类别”选项:

  • 'Directories' 表:它需要是当前的特许经营城镇(使用 'FranchiseGID' 列)
  • “目录”表:它必须适用于每个单独的子类别(GID 列)
  • “客户”表:没有客户已注册列在子类别中(GID 列)

因此使用这些表列的组合,使用“iAdvertCount”作为计数器和“ClientGID”来检查该特定子类别中是否有广告订阅;而且它只适用于当前的特许经营网站(FranchiseGID)。

我可以从一个表中选择信息,但不能从多个表中选择信息 - 因此我希望获得有关如何从上述列和表中选择所需信息的帮助。

这是我对“目录”表的了解程度,但还需要从“客户”中添加客户 GID 条件:

Dim iAdvertCount

SQLCommand = "SELECT COUNT(*) AS Counter FROM Directories WHERE GID is not null AND FranchiseGID is not null"
rsTemp.Open SQLCommand, objConn, adOpenStatic, adLockReadOnly
iSubscriptionCount = rsTemp("Counter")
rsTemp.Close
if iSubscriptionCount = 0 then
    %><a href="AddDirectory.asp?PGID=<% = rsDirectory("GID") %>"><% = GetIcon("Add", "Add Sub Directory", 25, True) %></a><%
end if

到目前为止,我可以在包含 ClientGID 的任何网站特许经营权(例如 Brentwood)目录上隐藏“添加子类别”选项,但它适用于所有子类别,无论它们是否包含客户订阅/广告。

我希望有人能提供帮助,并且确实能理解我写的东西以某种方式提供帮助,因为它会很有帮助!

【问题讨论】:

  • 当 AdminFranchiseGID 为 ') drop table uvw_DirectoryBrowser_Adverts select (' 时会发生什么?
  • 我不明白这个问题,并且缺少很多上下文并且提供了很多多余的信息
  • Sam 指出您的代码可能容易受到称为“SQL 注入”的黑客技术的攻击。用户是否可以输入任何内容以允许他们设置 AdminFranchiseGID 的值?因为如果他们将其设置为 Sam 向您显示的值,则生成的 SQL 命令将是:“SELECT COUNT(*) AS Counter FROM uvw_DirectoryBrowser_Adverts WHERE ... AND (FranchiseGID = '') Drop table uvw_DirectoryBrowser_Adverts select ('')” -- 这将选择一些数据,然后删除一个表,然后选择一个常量。在 Google 上搜索“避免 SQL 注入”以了解更多相关信息。
  • 如果您提供更多详细信息,应该能够为您提供更多帮助。表 uvw_DirectoryBrowser_Adverts 是什么样的?给我们列名和数据类型。另外,你如何判断一个子类别是否已经有广告?如果你不能告诉我们你想做什么,你肯定不能告诉SQL Server你想做什么。
  • 管理员应该只能在子类别中没有广告的情况下才能看到链接。我对您的数据结构不清楚。你能帮我理解目录和客户表吗?目录具有会计师子类别和基于示例的特许经营 ID(布伦特伍德或什鲁斯伯里)。存在布伦特伍德会计师的广告(记录在客户表中?)您想知道每个特许经营权的广告数量吗?只返回没有广告的地点列表?给定一个特许经营和子类别,有多少广告?我们要解决的问题是什么?

标签: sql asp-classic vbscript ado


【解决方案1】:

我希望这不仅仅是众所周知的黑暗中的一枪

我相信您需要使用存在运算符。

exist operator 在 where 子句中用于确定子查询是否返回结果。

所以您的查询可能如下所示:

SELECT COUNT(*) AS Counter
  FROM Directories
 WHERE GID is not null
   AND FranchiseGID is not null
   AND NOT EXISTS(SELECT 'ARBITRARY VALUE'
                    FROM clients
                   WHERE clients.gid = directories.gid)

exists 运算符利用了subquery,这就是为什么我们能够引用目录表,即使它不在子查询的 from 子句中。因此,如果子查询返回任何内容,则不会返回以被 count 函数计数

您可能需要更改子查询的 where 子句才能使其正常工作,因为我不确定您的数据库的结构

【讨论】: