0

製品のテーブル内で指定された検索結果を表示するページを作成しています。私が達成したいのは、「フィルターウィジェット」を表示して、ユーザーが検索を絞り込めるようにすることです。このウィジェットでは、利用可能なオプションのセットと、それらのオプションの結果の数を表示したいと考えています。そのため、ユーザーは、各基準に合わせて検索を絞り込むことを選択した場合に得られる結果の数を効果的に確認できます。これには、元の検索結果内で検索する必要があります。この例をここに示します。ここでは、[結果をフィルター処理] サイド バーに、一連の絞り込まれた検索が括弧内のプロパティの数と共に表示されます。

絞り込まれた基準ごとに個別のクエリを作成するのではなく、この問題を処理し、元の SQL クエリで絞り込まれた検索の数を取得する適切な方法があるかどうか疑問に思っていました。

4

2 に答える 2

1

回答 もう少し考えて作り直しました

元の回答は機能しますが、ご指摘のとおり、元の検索クエリを複数回実行し、処理に多くの時間を消費します。同じ結果を生成する代替メソッドは、はるかに高速でコーディングしやすい場合があります。答えは、このページの他の答えの中で @JEES によって示唆されています。

SELECT keywords.tag as Tag, COUNT( * ) as ResultCount
FROM keywords CROSS JOIN ( /* search query */ ) as rslt
WHERE
   /* provide the list of rules that will cause the system to eliminate bad row pairings */
GROUP BY Tag
ORDER BY ResultCount

この方法では、優先する検索タグを最初に 1 列だけの単純なテーブルで定義する必要があります。CROSS JOIN により、検索結果が新しいテーブルで何度も繰り返されます。たとえば、次の 2 つのテーブルを考えてみましょう。各値は列を持つ行を表します (つまり、結果 1 には、音楽アルバム検索の 4 つの列 [「アーティスト」、「アルバム名」、「リリース年」、「アルバム ID」] とResult2 は同じデータ構造になります。

キーワード:

TagOne, TagTwo

SearchResults: Result1, Result2, Result3, Result4

CROSS JOIN により、システムの作業メモリ内で次のものが生成されます。

CROSS JOIN TABLE:

TagOne, Result1
TagOne, Result2
TagOne, Result3
TagOne, Result4
TagTwo, Result1
TagTwo, Result2
TagTwo, Result3
TagTwo, Result4

WHERE 句は、保持する行と破棄する行をシステムに指示します。ここで、検索用語を、その検索用語が使用された場合に見つかる将来の結果と照合します。この場合、検索語「TagOne」は Result1 と Result4 を見つけるが、Result2 と Result3 は見つけられず、「TagTwo」は Result3 を除くすべての検索結果を見つけると仮定します。

システムの作業メモリ内の結果のテーブルは、次のようになります。

CROSS JOIN TABLE AFTER WHERE CLAUSE:

TagOne, Result1
TagOne, Result4
TagTwo, Result1
TagTwo, Result2
TagTwo, Result4

count コマンドと group by コマンドが連携して、このテーブルを次のように縮小します。

CROSS JOIN TABLE AFTER COUNT:

TagOne, 2
TagTwo, 3

次に、ASC または DESC のいずれかを選択すると、これらの検索用語が検索用語で最も役立つと思われる順序に並べ替えられます。これにより、元の提案の 2 秒以上よりも速く結果が得られることが私の予測です。

元の回答

あなたの質問に対する答えは、「はい、可能です」です。PHP を使用してクエリを一度に 1 用語ずつ作成し、UNION を使用してクエリを 1 つの式に結合してからデータベースに送信します。

SELECT 'searchtag' as Tag, COUNT( * )  as ResultCount
FROM /* current_search_results */ as rslt 
WHERE /* filter_list_here */ GROUP BY Tag 

UNION


SELECT 'searchtag2' as Tag, COUNT( * )  as ResultCount
FROM /* current_search_results */ as rslt 
WHERE /* filter_list_here */ GROUP BY Tag 

UNION


SELECT 'searchtag3' as Tag, COUNT( * ) as ResultCount
FROM /* current_search_results */ as rslt 
WHERE /* filter_list_here */ GROUP BY Tag 

/* current_search_results */ を、括弧内の元の検索 SQL のコピー()または以前のクエリで保存された一時テーブルへの参照に置き換えます。()個人的には、同じクエリを実行している別のユーザーによって変更/上書きされた可能性のある一時テーブルを参照していないときの心配が少ないという理由だけで、サブクエリ形式を使用するのが好きです。

結果の出力は、次のようなテーブルになります。

Tag  /  ResultCount
searchtag / 500
searchtag2 / 34
searchtag3 / 234

当然、追加できます

SELECT * FROM (/*above_query_here*/) as unordered_results ORDER BY ResultCount

最も多いレコード/最も少ないレコードを生成する検索タグでソートされた結果を作成するため。ソート順を変更するには、文の最後にASCorを使用します。DESCORDER BY

于 2013-05-10T22:48:02.657 に答える
1

COUNT(*)次のようにorを利用できると思いますCOUNT(kywds)

SQL フィドルのデモ

   SELECT kywds, COUNT(kywds) AS `Results`
     FROM keywords
 GROUP BY kywds
 ORDER BY COUNT(kywds)

kywds は、絞り込みフィルターのキーワードを含む列です。

于 2013-05-10T22:33:18.453 に答える