Coldfusion8 と MySQL 5.0.88 を使用した製品検索エンジンを使用しています。
製品検索には、複数ビューと単一ビューの 2 つの表示モードがあります。
Multipleは基本的なレコード情報を表示します。Singleは追加データをデータベースからポーリングする必要があります。
現在、ユーザーが検索を行っており、データベースをポーリングしています
(a)合計レコードと
(b) FROM から TO までのレコード。
ユーザーは常に現在の結果セットから単一ビューに移動するため、私の考えは、各ユーザーの現在の結果セットを保存し、データベースに再度クエリを実行して (無駄に) レコードの総数と (無駄に) 単一の以前にクエリしたレコードと、シングルビューにまだ必要な詳細情報を取得します。
しかし、私はこれでどこにも行きません。
各ユーザー(セッション)に固有であるため、現在の結果セットクエリをキャッシュできません。
クエリは、AJAX を介して呼び出している CFC 内の CFINVOKED メソッド内で実行されているため、クエリ全体が実行され、その後 CFC および CFINVOKE メソッドが破棄されるため、クエリまたは variables.cfc_storage のクエリを使用できません。
したがって、私の考えは、現在の結果セットをセッションスコープに保存することでした。これは、ユーザーが実行する新しい検索ごとに更新されます (ページネーションまたは完全に新しい検索)。保存される最大の結果は、表示される結果の数になります。
次を使用して、クエリを問題なく保存できます。
<cfset Session.resultset = query_name>
これにより、次のようにクエリ全体が結果とともに保存されます。
query
CACHED: false
EXECUTIONTIME: 2031
SQL: SELECT a.*, p.ek, p.vk, p.x, p.y
FROM arts a
LEFT JOIN p ON
...
LEFT JOIN f ON
...
WHERE a.aktiv = "ja"
AND
... 20 conditions ...
SQLPARAMETERS: [array]
1) ... 20+ parameters
RESULTSET:
[Record # 1]
a: true
style: 402
price: 2.3
currency: CHF
...
[Record # 2]
a: true
style: 402abc
...
これは、ユーザーが新しい検索を行うたびに上書きされます。ただし、ユーザーがこれらのアイテムのいずれかの詳細を表示したい場合、一時ストレージから必要なレコードにアクセスできるかどうかを照会する必要はありません (レコードの総数と 1 つのレコードを取得する)。このようにして、以前に取得したデータを取得するために、それぞれ2031の実行時間に相当する 2 つのデータベース トリップを節約できます。
トレードオフは、すべてのユーザーが Session.scope で最大 48 個の結果 (ページあたりのアイテムの最大数) の結果セットを持つことです。
私の質問:
1. これは実行可能ですか、それともデータベースを再クエリする必要がありますか?
2.上記のような構造/配列/オブジェクトがある場合、スタイル番号で必要なレコードを選択するにはどうすればよいですか = 結果セットにアクセスするにはどうすればよいですか? 保存されたクエリをループすることはできません(これをしばらく試してみました...)。
手伝ってくれてありがとう!