函数反向

ds97pgxw  于 2021-06-19  发布在  Mysql
关注(0)|答案(6)|浏览(290)

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

dwbf0jvd

dwbf0jvd1#

WHERE freetext LIKE ('%help%' OR '%emergency%') 不是这样工作的。
应该是:

WHERE freetext LIKE '%help%' OR freetext LIKE '%emergency%'

附加:来自类似功能的文档:
对于like,可以在模式中使用以下两个通配符:
%匹配任意数量的字符,甚至零个字符。
_只匹配一个字符。

mysql> SELECT 'David!' LIKE 'David_';
        -> 1
mysql> SELECT 'David!' LIKE '%D%v%';
        -> 1
kninwzqo

kninwzqo2#

您应该尝试:

WHERE freetext LIKE('%help%')  OR freetext LIKE('%emergency%')
dddzy1tm

dddzy1tm3#

通过执行以下类似操作,您可以找到所有关键字为“紧急”的邮件:

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%';
enxuqcxy

enxuqcxy4#

你可能在寻找“帮助”和“紧急情况”这两个词。你不想找到
杰克,你的笑话没用。
你必须减去税金。希望这有帮助:-)
因此,请检查您的mysql版本是否支持正则表达式,您可以在其中查找单词:

select *
from teammessages
where freetext regexp '[[:<:]](help|emergency)[[:>:]]';

rextester演示:http://rextester.com/ilropq12660

mrfwxfqh

mrfwxfqh5#

原始查询的正确形式是:

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”、“help”或“help”等词。在示例表中,此查询返回:

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 s

mklgxw1f

mklgxw1f6#

我建议生成一个列。
答案涉及 LIKE 在这里会很慢,答案涉及全文搜索( freetext )表达式告诉mysql索引列中的每个单词,而不仅仅是你关心的单词。
您可以使用生成的列来生成一个简单的y/n或1/0结果,该结果仅适用于您关心的单词,这些单词只需要在插入/更新时计算完整的列数据。

相关问题