我正在尝试从查询中获得正确的结果并且遇到一些困难,我的产品会通过其类别,子类别和相关类别显示。关联类别是用户可以将产品与次要类别(对于类似产品)相关联的位置。
数据正在通过产品功能(例如摆动或幻灯片等)进行钻取。
要素向下钻取的结果应该是,如果选择了Swings,则只应显示所选类别,子类别或与Swings相关联的类别中的产品。
然后,最终用户可以点击其他功能,例如幻灯片,结果应该只是所选类别,子类别或相关类别中的产品,包含波动和幻灯片。
以下查询使用嵌套查询获取具有关联类别的产品(这可以正常工作):
<cfquery name="getProductList" datasource="#application.dsn#">
SELECT
p.uid_product,
p.txt_prod_name,
p.uid_prod_templteid,
p.txt_prod_metaurl,
p.txt_prod_h1,
p.txt_prod_ref,
p.mon_prod_rrp,
p.mon_prod_current,
i.txt_pimg_name,
i.uid_pimages,
i.txt_pimg_alt
FROM dbo.tbl_products
IINNER JOIN tbl_product_images i ON (p.uid_product = i.uid_pimg_prodid)
WHERE p.uid_prod_webid=<cfqueryparam cfsqltype="cf_sql_integer" value="#application.webid#">
<!---If! If arguments to uid_subcategory is defined: USAGE! Get sub cats--->
<cfif Isdefined('arguments.uid_subcategory') AND arguments.uid_subcategory NEQ "">
AND p.uid_prod_subcatid = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_subcategory#"></cfif>
AND dbo.tbl_product_images.bit_pimg_primary=<cfqueryparam cfsqltype="cf_sql_bit" value="yes">
<cfif Isdefined('arguments.uid_categories') AND arguments.uid_categories NEQ "">
AND p.uid_prod_catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_categories#"> OR
<!---QUERY! Look for associated categories and deliver product to the page--->
uid_product IN (SELECT (ac.uid_assoc_prodid)
FROM tbl_assoc_categories ac
WHERE ac.uid_assoc_catid=<cfqueryparam cfsqltype="cf_sql_integer" value="#uid_categories#">
<!---If! If the user selects a subcategory we only want the associated products directly linked to the chosen sub category --->
<cfif Isdefined('arguments.uid_subcategory') AND arguments.uid_subcategory NEQ "">
AND ac.uid_assoc_subcatid=<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_subcategory#"></cfif>)</cfif>
ORDER BY txt_prod_name asc
</cfquery>
<cfreturn getProductList>
</cffunction>
我使用以下查询来使用功能深入了解产品:
<cfquery name="getFeatureProducts" datasource="#application.dsn#">
SELECT
p.uid_product,
p.txt_prod_name,
p.uid_prod_templteid,
p.txt_prod_metaurl,
p.txt_prod_h1,
p.txt_prod_ref,
p.mon_prod_rrp,
p.mon_prod_current,
i.txt_pimg_name,
i.uid_pimages,
i.txt_pimg_alt
FROM tbl_products p
INNER JOIN tbl_product_images i ON (p.uid_product = i.uid_pimg_prodid)
INNER JOIN tbl_product_features f ON (p.uid_product = f.uid_prodf_prodid)
WHERE 0=0
AND f.uid_prodf_featid IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">)
GROUP BY p.uid_product, p.txt_prod_name, p.uid_product, p.txt_prod_name, p.uid_prod_templteid, p.txt_prod_metaurl, p.txt_prod_h1, p.txt_prod_ref,p.mon_prod_rrp,p.mon_prod_current,i.txt_pimg_name,i.uid_pimages,i.txt_pimg_alt
HAVING COUNT(f.uid_prodf_featid) = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ListLen(arguments.uid_features)#">
ORDER BY p.txt_prod_name
</cfquery>
目前,上述查询会返回所有产品,而不考虑类别,子类别或相关类别。我需要能够将第一个查询的功能添加到第二个查询中。我可以通过添加isdefined
和sql AND语句来完成类别和子类别。这是我正在努力的相关类别。不知道如何将嵌套查询添加到WHERE子句并仍然保持查询工作,我已经尝试过玩,但只是没有工作,因为它总是给出错误的结果。
感谢任何帮助!
答案 0 :(得分:2)
我在我的网站sqlfiddle.com上设置了一个示例查询,它会演示您的问题(和我的回答):http://sqlfiddle.com/#!3/8d051/2
这是它的内容,包括CF代码:
SELECT
p.uid_product,
p.txt_prod_name,
p.uid_prod_templteid,
p.txt_prod_metaurl,
p.txt_prod_h1,
p.txt_prod_ref,
p.mon_prod_rrp,
p.mon_prod_current,
i.txt_pimg_name,
i.uid_pimages,
i.txt_pimg_alt
FROM tbl_products p
INNER JOIN tbl_product_images i ON (p.uid_product = i.uid_pimg_prodid)
<cfloop list="#arguments.uid_features#" index="featid">
INNER JOIN tbl_product_features f#featid# ON
f#featid#.uid_prodf_prodid = p.uid_product AND
f#featid#.uid_prodf_featid = <cfqueryparam value="#featid#" cfsqltype="cf_sql_integer">
</cfloop>
ORDER BY
p.txt_prod_name
此方法使用连接来过滤结果集,并使用cfloop为每个要素执行一次。这应该有用。