反向输入功能

时间:2018-09-21 13:19:27

标签: mysql sql

请考虑下表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'))。

6 个答案:

答案 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)[[:>:]]';

上个月的演示:http://rextester.com/ILROPQ12660

答案 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%';