将嵌套,内部或子查询添加到现有查询

时间:2012-01-30 00:14:35

标签: sql coldfusion

我正在尝试从查询中获得正确的结果并且遇到一些困难,我的产品会通过其类别,子类别和相关类别显示。关联类别是用户可以将产品与次要类别(对于类似产品)相关联的位置。

数据正在通过产品功能(例如摆动或幻灯片等)进行钻取。

要素向下钻取的结果应该是,如果选择了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子句并仍然保持查询工作,我已经尝试过玩,但只是没有工作,因为它总是给出错误的结果。

感谢任何帮助!

1 个答案:

答案 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为每个要素执行一次。这应该有用。