2012-09-28 117 views
2

我有一個表的結構基本上是:MySQL關鍵字搜索查詢與所有關鍵字匹配項目?

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') 

但我也希望能夠使用相同的表結構來查找只包含任何數量的搜索詞的'項目'。

我知道我可以使用FullText by Items表有超過100,000條記錄和ItemWords表多了很多時間,所以已經建立了這樣的結構來使這些搜索非常快速並且對服務器影響最小。上面的一個單詞或任何單詞搜索確實超級快捷。

謝謝!

回答

1
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子句

+0

謝謝,作品的出色和快速我可以問爲什麼你使用內連接而不是左連接或右連接? – Claud

+0

內連接匹配哪裏有兩個表中的元素 - 哪些是您感興趣的內容。即使連接表中沒有匹配,左側或右側(外部)連接也會匹配。 – podiluska