2012-09-28 114 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