如何在ColdFusion中的变量中存储查询数据以供以后使用?

时间:2012-05-06 10:17:19

标签: coldfusion coldfusion-9 cfquery

我正在尝试检索并存储从我的表中检索到的每个项目的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,所以两次。

非常感谢任何关于如何实现这一目标的建议。

由于

2 个答案:

答案 0 :(得分: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注入攻击。

答案 1 :(得分: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) />