0

私は3つのテーブルを持っています。

表 1 はパッケージです。表 2 は package_to_keyword です。表 3 はキーワードです。

パッケージは複数のキーワードに接続できます。したがって、package_to_keyword キーワードとパッケージの結合を照会すると、特定のキーワードに関連するすべてのパッケージを検索できます。それは私が理解している部分です。 ここに画像の説明を入力

今...私の質問は、キーワードのリストに一致するパッケージを取得するにはどうすればよいですか? 現在、PHP では、SQL ステートメントをループしてから、各キーワードのすべての結果をループし、array_intersect() を実行して、すべての結果セットに表示されるパッケージに絞り込みます。ただし、このタイプの関係を処理するように SQL が構築されていると確信しているときに各キーワードに対してクエリを実行しているため、これは悪いことだと確信しています。実行するクエリの種類がわからないだけです。

重要なのは、キーワードのリストは任意の数の単語にすることができるということです。IN ('keyword','array','returns','all','results') のようなものを使用すると、パッケージが必要なときに、キーワードのいずれかと関係があるすべてのパッケージのリストを取得する だけですすべてのキーワードと関連性があります。

考え?

4

2 に答える 2

3
select title
from packages p
inner join pack_to_tag pt on p.index = pt.pIndex
inner join keyworks w on w.index = pt.kindex
where word in ('keyword','array','returns','all','results')
group by title
having count(*) = 5
于 2012-05-31T17:21:33.507 に答える
2

まず、「PreQuery」(認定された製品の結果) は、探しているキーワードのいずれかを含むキーワードに結合された製品のみを検索し、最終的に 1 つ以上のエントリを返します。GROUP BY は、期待している数を確認します...次に、製品に参加して最終結果を取得します。

select
      p.*
   from
      ( select ptt.pIndex
           from pack_to_tag ptt
                   join keywords k
                      on ptt.kindex = k.index
                     and k.word in ( 'word1', 'word2', 'word3' )
           group by 
              ptt.pIndex
           having 
              count(*) = 3 ) QualifiedProducts
      join Products p
         on QualifiedProducts.pIndex = p.index
于 2012-05-31T17:29:00.620 に答える