请考虑下表teammessages
:
15:10 | Peter | I'm off to the store, call my mobile phone if you need me.
15:11 | Susy | Have you seen the new scanner? It's lightning fast.
15:15 | Anne | We have an emergency here, John broke the tap! Please switch off the water supply!
15:15 | John | I did what?? :-D I'm in Vienna!
15:16 | Peter | I'm stuck in the elevator, help!
15:17 | Anne | I said WATER, not POWER supply!
当我想从混乱的自由文本中SELECT
发出紧急消息(包含诸如“帮助”或“紧急”之类的关键字)时,我将不得不具有“反向输入”功能,该功能不会检查如果该字段位于给定的替代列表(WHERE APPLECOLOR IN ('YELLOW', 'RED')
)中,但该字段检查给定替代项的值是否位于该字段(WHERE freetext REVERSE_IN ('help', 'emergency')
)。
我已经尝试过像WHERE freetext LIKE ('%help%' OR '%emergency%')
这样的结构,但这给了我空洞的结果。
说明:我可以使用freetext LIKE ... OR freetext LIKE ... OR freetext LIKE ...
来做到这一点,但是它变得很长。因此,我只是想寻找一种类似IN
的缩写形式(APPLECOLOR = 'RED' OR APPLECOLOR = 'YELLOW'
<=> APPLECOLOR IN ('RED', 'YELLOW')
)。
答案 0 :(得分:2)
原始查询的正确格式为:
WHERE freetext LIKE '%help%' OR freetext LIKE '%emergency%'
不过,您可能还想考虑使用MATCH
。为此,您需要在FULLTEXT
列上有一个message
索引,您可以使用以下命令添加该索引:
ALTER TABLE teammessages ADD FULLTEXT INDEX(message);
然后您可以使用类似这样的查询进行搜索:
SELECT *
FROM teammessages
WHERE MATCH(message) AGAINST('help emergency' IN BOOLEAN MODE)
与LIKE
相比,它会给您带来更好的结果,后者还会匹配“ whelp”或“ helpful”或“ helps”等词。在示例表中,此查询返回:
time name message
15:15:00 Anne We have an emergency here, John broke the tap! Please switch off the water supply!
15:16:00 Peter I'm stuck in the elevator, help!
此查询还具有不像多个LIKE
一样长的速度
答案 1 :(得分:1)
我建议使用Generated Column。
此处涉及LIKE
的答案将会非常慢,涉及全文搜索(freetext
)表达式的答案告诉MySql为每个单词索引 < / em>列中,而不仅仅是您关心的单词。
您可以使用生成的列为您关心的单词生成简单的Y / N或1/0结果,只需在INSERT / UPDATE时评估整个列数据即可。
答案 2 :(得分:1)
您可能正在寻找单词帮助和紧急信息。你不想找到
因此,请检查您的MySQL版本是否支持可在其中查找单词的正则表达式:
select *
from teammessages
where freetext regexp '[[:<:]](help|emergency)[[:>:]]';
答案 3 :(得分:0)
WHERE freetext LIKE ('%help%' OR '%emergency%')
不能这样工作。
应该是:
WHERE freetext LIKE '%help%' OR freetext LIKE '%emergency%'
其他:来自documentation of LIKE函数:
使用LIKE,您可以在 模式:
%匹配任意数量的字符,甚至零个字符。
_恰好匹配一个字符。
mysql> SELECT 'David!' LIKE 'David_';
-> 1
mysql> SELECT 'David!' LIKE '%D%v%';
-> 1
答案 4 :(得分:0)
您应该尝试:
WHERE freetext LIKE('%help%') OR freetext LIKE('%emergency%')
答案 5 :(得分:0)
您可以通过执行类似的操作来找到所有紧急消息,这些紧急消息中包含您所知道的关键字:
SELECT * FROM teammessages WHERE freetext LIKE '%help%' OR freetext LIKE '%emergency%';
您可以通过以下方式使用NOT LIKE
来做到这一点:
SELECT * FROM teammessages WHERE freetext NOT LIKE '%help%' AND freetext NOT LIKE '%emergency%';