2

基本的に次のようなテーブル構造があります。

Items
ID: INT(10)
Title: CHAR(255)

ItemsWords
ID: INT(10)
ItemID: INT(10)
Word: CHAR(50)

「アイテム」レコードごとに、「ItemsWords」テーブルに複数のレコードがあります。

これを使用して、次のような単一の単語を含むすべてのアイテムを見つけることができます。

SELECT * FROM Items i, ItemsWords w WHERE w.ItemID=i.ID AND w.Word='WORD_TO_FIND'

これを使用して、次のようないくつかの単語のいずれかを含むすべてのアイテムを見つけることができます。

SELECT * FROM Items i, ItemsWords w 
WHERE w.ItemID=i.ID 
AND (w.Word='WORD_TO_FIND' OR w.Word='ANOTHER_WORD_TO_FIND')

しかし、同じテーブル構造を使用して、任意の数の検索語をすべて含む「アイテム」のみを検索できるようにしたいと考えています。

Itemsテーブルには 100,000 を超えるレコードがあり、ItemWordsそれよりも何倍も多くのテーブルがあるため、フルテキストを使用できることがわかっているため、これらの検索を非常に迅速に行い、サーバーへの影響を最小限に抑えるために、この方法で構造を設定しました。上記の単語または任意の単語の検索は、非常に高速です。

ありがとうございました!

4

1 に答える 1

2
select Items.id, Items.Title
from Items
   inner join ItemsWords   
   on Items.ID = ItemsWords.ItemID
where ItemsWords.Word in ('WORD_TO_FIND','ANOTHER_WORD_TO_FIND') 
group by Items.id, Items.Title
having count(distinct ItemsWords.id) =2

最後の行の数字は、検索する単語のリスト内の単語の数です (つまり、この例では 2.

inner joinではなく、構文を使用してテーブルが結合される方法に注意してくださいwhere

于 2012-09-28T10:48:08.817 に答える