我有一张约100,000行的表。
每行包含一个句子,句子片段或短语。
我想编写一个查询,该查询将查找包含 所有 一组字词的所有行,即使条件中的字词的顺序与句。
例如,如果我的表格如下:
id sentence
-- ---------------------------------------------------------------------------
1 How now brown cow
2 Alas, poor Yorick! I knew him
3 Call me Ishmael
4 A screaming comes across the sky
5 It was a bright cold day in April, and the clocks were striking thirteen
6 It was the best of times, it was the worst of times
7 You don't know about me without you have read a book
8 In the late summer of that year we lived in a house in a village
9 One summer afternoon Mrs. Oedipa Maas came home from a Tupperware party
10 It was a queer, sultry summer, the summer they electrocuted the Rosenbergs
我的查询条件是一个或多个单词,按任何特定顺序排列。
结果集应包含包含所有单词的所有句子。
例如,如果条件为the was
,则结果应包含第5,6,10行。
理想情况下,我想对此进行改进,以便查询只需要包含单词的 start 。 (请注意,我希望允许用户只输入单词的开头,但不能只输入中间或结尾)。
例如,如果标准为elect sul
,则结果将包括第10行。
目前,我正在这样做:
SELECT
id, sentence
WHERE
(sentence LIKE 'elect%' OR sentence LIKE '% elect%')
AND
(sentence LIKE 'sul%' OR sentence LIKE '% sul%')
这有效(我认为......) - 它找到应有的一切。但是,它很慢。
有更好的方法吗?
对于它的价值 - 我可以灵活地重新设计表格,或创建额外的“帮助”表。
,例如,我考虑创建一个表,其中包含每个唯一单词的行和包含它的句子的每一行的键。
此外 - 查询需要在MySQL中运行。
非常感谢提前。
答案 0 :(得分:2)
你的方法很好。如果您想处理多个单词,可以执行以下操作:
select s.id, s.sentence
from sentence s join
(select 'elect' as word union all
select 'sul' as word
) words
on s.sentence like concat(word, '%') or
s.sentence like concat('% ', word, '%')
group by s.id, s.sentence
having count(*) = (select count(*) from words)
这不会更快(因为你有额外的group by
)。但它确实提供了更多的灵活性。
顺便问一下,您是否研究过MySQL中的全文搜索功能?