1

テーブルから取得した各アイテムのIDを取得して保存しようとしているので、後でこれらのIDを使用できます。クエリをネストしようとしましたが、うまくいきませんでした。これが私の最初のクエリです:

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

ここで、このクエリを出力すると、必要な2つのIDである1と117が表示されます。

次のクエリは次のとおりです。

<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番目のクエリをループする必要があるため、2回実行します。

これを達成する方法についての提案をいただければ幸いです。

ありがとう

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>

このクエリを変更して、「join」を使用して[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 に答える