回答 もう少し考えて作り直しました
元の回答は機能しますが、ご指摘のとおり、元の検索クエリを複数回実行し、処理に多くの時間を消費します。同じ結果を生成する代替メソッドは、はるかに高速でコーディングしやすい場合があります。答えは、このページの他の答えの中で @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
最も多いレコード/最も少ないレコードを生成する検索タグでソートされた結果を作成するため。ソート順を変更するには、文の最後にASC
orを使用します。DESC
ORDER BY