1

我正在尝试为从我的表中检索到的每个项目检索和存储 ID,以便以后可以使用这些 ID。我尝试嵌套查询,但这没有奏效。这是我的第一个查询:

<CFQUERY datasource="MyDSN" name="MAIN2"> SELECT * from order_items where orderID= #orderID#</CFQUERY>

现在,如果我输出这个查询,它会显示 1 和 117,这是我需要的两个 ID。

我的下一个查询是:

<CFQUERY datasource="MyDSN" name="MAIN3">select c.catalogueID,
c.product_name,
c.product_price,
c.description,
p.productID

from products p
join product_catalogue c on c.catalogueid = p.catalogueid
where p.productid = "#productID#"</CFQUERY>

但它告诉我 productID 没有定义,它显然是空的。我刚刚开始使用 ColdFusion,所以我不确定存储我需要的值的最佳方式,所以我再次使用它们。我还需要循环第二个查询以针对每个 ID 1 和 117 运行两次。

任何有关如何实现这一点的建议将不胜感激。

谢谢

4

2 回答 2

3

我的基本规则是,如果我发现自己使用查询来创建其他查询或循环查询以执行其他查询;现在是考虑合并查询的时候了。

我不确定您在 MAIN2 查询中使用哪个字段来提供 MAIN3 查询。所以,我在下面的查询中输入了“productID”。您可能需要更改它以适合您的字段名称。

<CFQUERY datasource="MyDSN" name="MAIN3">select c.catalogueID,
c.product_name,
c.product_price,
c.description,
p.productID

from products p
join product_catalogue c on c.catalogueid = p.catalogueid
where p.productid IN (SELECT DISTINCT productID from order_items where orderID= <cfqueryparam value="#orderID#" cfsqltype="CF_SQL_INTEGER">)
</CFQUERY>

您还可以更改此查询以利用“连接”将 [order_items] 连接到查询。

最后,您应该<cfqueryparam>为 where 子句使用标签;这有助于保护您的查询免受 sql 注入攻击。

于 2012-05-07T03:53:39.510 回答
1

每当我缓存数据以供以后使用时,我倾向于问自己我将如何使用这些数据,以及它是否属于另一种数据类型而不是查询。

例如,如果我想要一堆可能通过 ID 访问的数据,我可以创建一个结构,其中键是 ID,数据是数据集的另一种结构。然后我将把这个结构保存在应用程序范围内,只在需要时刷新它。这速度很快,而且比每次都查询要容易得多。当创建原始数据集的查询是一种具有大量连接、子查询、神奇的跨数据库存储过程但数据集返回实际上相当小的资源占用时,这尤其有用。

所以创建你的产品结构看起来像这样:

<CFQUERY datasource="MyDSN" name="MAIN3">
  SELECT 
    c.catalogueID,
    c.product_name,
    c.product_price,
    c.description,
    p.productID
  FROM products p
  JOIN product_catalogue c 
  ON c.catalogueid = p.catalogueid
  WHERE p.productid = <cfqueryparam value="#ProductID#" cfsqltype="cf_sql_integer">
</CFQUERY>

<cfset products = structNew() />
<cfset item = structNew() />
<cfloop query="MAIN3">
   <cfif NOT structKeyExists(products, productID)>
      <cfset item = structNew() />
      <cfset item.catalogueID = catalogueID />
      <cfset item.product_name = product_name />
      <cfset item.product_price = product_price />
      <cfset item.description = description />
      <cfset products[productID] = structCopy(item) />
   </cfif>
</cfloop>

<cfset application.products = structCopy(products) />
于 2012-05-07T13:33:34.517 回答