2012-05-06 4 views
1

테이블에서 검색 한 각 항목에 대해 ID를 검색하고 저장하려고하므로 나중에이 ID를 사용할 수 있습니다. 나는 쿼리를 중첩 시키려고했지만이 방법은 효과가 없었다. 여기 내 첫 번째 쿼리입니다 :나중에 사용할 ColdFusion에서 변수에 쿼리 데이터를 저장하는 방법은 무엇입니까?

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

지금, 나는 출력이 표시이 쿼리, 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> 

그러나이 제품 ID가 정의되어 있지 않은 것을 말해, 그것은 분명히 비어 있습니다. ColdFusion을 사용하기 시작한 것이므로 필요한 값을 저장하는 최선의 방법이 확실하지 않아 다시 사용할 수 있습니다. 각 ID 1과 117에 대해 두 번째 쿼리를 반복 실행해야하므로 두 번 반복해야합니다.

이 작업을 수행하는 방법에 대한 제안은 크게 감사하겠습니다.

감사

답변

3

내 기본 규칙입니다 나 자신이 다른 쿼리를 생성하는 쿼리를 사용하거나 다른 쿼리를 실행하는 쿼리를 통해 루핑 찾을 경우; 그것은 질의들을 결합하는 것을 고려할 시간이다.

MAIN3 쿼리를 제공하기 위해 MAIN2 쿼리에서 어떤 필드를 사용하고 있는지 잘 모르겠습니다. 그래서 아래의 쿼리에서 "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]를 쿼리에 연결할 수 있습니다.

마지막으로 where 절에 <cfqueryparam> 태그를 사용해야합니다. 이렇게하면 SQL 주입 공격으로부터 쿼리를 보호 할 수 있습니다.

+0

우수 조언 내가 답변을 시험하고 일을, 감사합니다. 고마워요 – deucalion0

1

나중에 사용할 데이터를 캐싱 할 때마다 필자는 해당 데이터를 어떻게 사용할 것이며 쿼리가 아닌 다른 데이터 형식에 속하는지 여부를 자문하는 경향이 있습니다.

예를 들어, ID를 통해 액세스 할 가능성이 높은 데이터가 필요하다면 키가 ID 인 구조를 만들 수 있으며 데이터는 데이터 집합의 다른 구조입니다. 그런 다음이 구조를 응용 프로그램 범위에 저장하고 필요할 때만 새로 고칩니다. 매번 질의하는 것이 아니라 지루하고 빠르며 으로 쉽게 잡을 수 있습니다. 이것은 원본 데이터 세트를 생성하는 쿼리가 조인, 서브 쿼리, 마술 크로스 db 스토어드 프로 시저를 많이 사용하는 리소스 호그 일 때 유용하지만 데이터 집합 반환은 실제로 매우 적습니다.

그래서 귀하의 제품 구조를 만드는 것은 다음과 같이 보일 것입니다 :

<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) /> 
+0

답변 해 주셔서 감사합니다! 나는 당신이 제안한 것을 메모하고 어느 시점에서 그것을 사용하게되기를 희망합니다! 감사합니다. :) – deucalion0