2017-05-02 18 views
2

私の「製品編集」ページには、ユーザーが製品に関連付けることができるすべての「ドキュメント」(テーブルから)を選択リストが表示しています。別のクエリでクエリ結果がループしますか?

<select name="pdid1" size="15" multiple id="pdid1" style="width:450px"> 
     <cfoutput query="get"> 
      <option value="#get.pdid#"> 

      #pdname# 

      </option> 
     </cfoutput> 
    </select> 

ドキュメントがすでにこの製品に関連付けられている場合、私はそれが<select>リストに表示したくないん

次のコードは、選択リストのテーブルで最初に見つかったドキュメントのみを削除しています。したがって、最初のクエリを2番目のクエリからすべての一致を削除することを確認するために、最初のクエリを '内側'にループする必要があります。

<!---Checks for any docs already associated with this product---> 

<cfquery name="find" datasource="#application.dsn#"> 
    SELECT * FROM prodrelated 
    WHERE prprodid = '#url.id#' 
</cfquery> 

<!---Now remove any docs from the Select List query that are already associated with this product---> 

<cfquery name="get" datasource="#application.dsn#"> 
    SELECT * FROM productdocs 
    WHERE NOT productdocs.pdid = '#find.pritemid#' 
</cfquery> 

どのように私は<select>リストがすでにこの製品に関連付けられているすべてのドキュメントを表示していないことを確認することができますか?

valueList(find.pritemid)が作成し値

答えて

2

代わりの

WHERE NOT productdocs.pdid = '#find.pritemid#' 

は、あなたは常にすべてのダイナミックデータベースのcfqueryparamを使用する必要があり、元のクエリ

WHERE productdocs.pdid NOT IN 
    (<cfqueryparam cfsqltype="cf_sql_integer" value="#valueList(find.pritemid)#" list="true">) 

からすべての行にINをしたいです"find"クエリのすべてのpritemid値のカンマ区切りリストと list="true"は、cfqueryparamにリストまたは値が必要であることを伝えます。

+0

ありがとう、マット。それは閉じているだけだった ")"と魅力を働いた。ヤフー! –

+0

@ BlueDaNoob - 2つのクエリを使用する唯一の理由はフィルタリングされていますか?動作しますが、外部結合を使用すると、同じことをより効率的に実行できます。 – Leigh

1

#find.pritemid#を使用すると、クエリから返された最初のpritemidになります。それは外部結合を持つ単一のクエリより効率的に使用され、あなたが実際に何か他のもののための最初のクエリからのデータを必要としない限り、これは、Li

1

を使用しています

WHERE productdocs.pdid NOT IN (#ValueList(find.pritemid)#) 

:あなたがするWHERE句を変更することができます、または存在しないことさえある。これにより、追加のクエリのオーバーヘッドが回避されます。特に、必要以上の列、つまりselect *を取得するもの。また、NOT IN (...)句を実行すると、リストにある値が多くなるほどパフォーマンスが低下する傾向があります。

代わりに、一致するレコードがはないがprodrelatedテーブルに存在しないレコードだけを返すようにOUTER JOINを使用します。

SELECT pd.pdname, pd.pdid 
FROM productdocs pd LEFT JOIN prodrelated pr 
      ON pd.pdid = pr.pritemid 
      AND pr.prprodid = <cfqueryparam value="#url.id#" cfsqltype="cf_sql_integer"> 
WHERE pr.prprodid IS NULL 

NB:また、唯一のあなたが必要とする列を選択するのではなく、 SELECT *

+0

あなたの助けを借りて、私のひどい英語、リーをきれいにしてくれてありがとう! –

+0

ようこそ。それほど悪くはありませんでした。私は多くの悪いことを見たことがあります..時折私自身の投稿から;-) – Leigh

関連する問題