我有一个表格结构,基本上是:
Items
ID: INT(10)
Title: CHAR(255)
ItemsWords
ID: INT(10)
ItemID: INT(10)
Word: CHAR(50)
对于每个"项目"记录,"项目字"表中有多个记录。
我可以找到使用它的所有项目,其中包含一个单词,如下所示:
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
表比这多很多倍,所以以这种方式设置结构以使这些搜索非常快速并且对服务器的影响最小。上面的一个单词或任何单词搜索确实非常快。
谢谢!
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
子句)联接表