钻取数据ColdFusion

时间:2011-12-23 15:54:12

标签: sql coldfusion

我在深入研究一些数据时遇到了麻烦,这就是表结构

产品表

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以及何时添加和删除它们。

我确信我过于复杂,但任何帮助都会受到赞赏。

2 个答案:

答案 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