我在深入研究一些数据时遇到了麻烦,这就是表结构
产品表
uid_product(唯一身份证)
txt_prod_name(产品名称)
表名:tbl_products
产品功能
uid_feature(唯一身份证)
txt_feature_name(要素名称)表名称:tbl_features
指定的产品功能
uid_prodf(唯一身份证)
uid_prodf_prodid(uid_product的外键)
uid_prodf_featid(uid_features的外键)
表名:tbl_prod_features
一个产品可以具有许多功能,因此使用tbl_prod_features表。
我创建了以下查询,以获取结果;
<cfquery name="getFeatureProducts" datasource="#application.dsn#">
SELECT uid_product, txt_prod_name
FROM dbo.tbl_products
WHERE uid_product IN (SELECT (dbo.tbl_product_features.uid_prodf_prodid)
FROM dbo.tbl_product_features
WHERE uid_prodf_featid IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">))
ORDER BY dbo.tbl_products.txt_prod_name
</cfquery>
这非常适合获取与最终用户选择的功能相关联的所有产品。但是,我需要实现以下目标,
如果用户选择;
功能A =显示5个产品(其中5个产品中有3个包含功能B)
如果用户选择;
功能B = 3个产品
目前,使用in运算符进行查询时,它仍将检索5个产品。
我的第一个想法是创建一个动态where语句添加AND运算符,但是uid_prodf_featid = 5 AND uid_prodf_featid = 6将始终产生0结果。
我的第二个想法是从第一次向下钻取构建一个产品ID数组,即获取前5个产品的ID,然后将它们传递给查询,然后深入了解这些功能,这是正常的,并且正确的结果是获得。
然而,用户可以删除功能(以任何顺序),因此我会以某种方式跟踪产品ID以及何时添加和删除它们。
我确信我过于复杂,但任何帮助都会受到赞赏。
答案 0 :(得分:1)
使用HAVING
子句计算匹配功能的数量,并仅返回所有所请求功能的产品。
例如,如果arguments.uid_features
始终包含唯一功能ID,则可以执行以下操作:
SELECT p.uid_product, p.txt_prod_name
FROM tbl_products p INNER JOIN tbl_product_features f
ON p.uid_product = f.uid_prodf_prodid
WHERE f.uid_prodf_featid IN ( <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="true"> )
GROUP BY p.uid_product, p.txt_prod_name
HAVING COUNT(f.uid_prodf_featid) = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ListLen(arguments.uid_features)#">
ORDER BY p.txt_prod_name
答案 1 :(得分:0)
我认为这可能会更好。首先,它摆脱了子选择。其次,它会过滤选定的要素ID,然后按相关要素对结果产品进行分组。
SELECT
a.uid_feature,
a.txt_feature_name,
c.uid_product,
c.txt_prod_name
FROM
tbl_features a
INNER JOIN
tbl_prod_features b
ON
b.uid_prodf_featid = a.uid_feature
<cfif listLen( arguments.uid_features ) NEQ 0>
AND
a.uid_feature IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">)
</cfif>
INNER JOIN
tbl_products c ON c.uid_product = b.uid_prodf_prodid
GROUP BY
a.uid_feature
ORDER BY
c.txt_prod_name