mysql - 反转 IN 功能

标签 mysql sql

考虑下表团队消息:

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紧急消息时,包含诸如“help”或“emergency”之类的关键字,我必须有一个“reverse IN”功能,它不会't 检查字段是否在给定的备选列表中(WHERE APPLECOLOR IN ('YELLOW', 'RED'))但是检查给定备选项的值是否在字段中(WHERE freetext REVERSE_IN('帮助','紧急'))。

我尝试过像WHERE freetext LIKE ('%help%' OR '%emergency%') 这样的结构,但这给了我空的结果。

说明:我可以使用freetext LIKE ... OR freetext LIKE ... OR freetext LIKE ... 来做到这一点,但它变得很长。所以我只是在寻找像 IN 这样的简写形式是“相反的情况”(APPLECOLOR = 'RED' OR APPLECOLOR = 'YELLOW' <=> APPLECOLOR在('RED','YELLOW'))。

最佳答案

原始查询的正确形式是:

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

但是您可能还想考虑使用 MATCH .为此,您需要在 message 列上有一个 FULLTEXT 索引,您可以使用以下命令添加该索引:

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 那样快

关于mysql - 反转 IN 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52444663/

相关文章:

mysql - 从单个文件恢复所有 MySQL 数据库

MySQL if 触发器内的条件

mysql - 在 SQL 中选择集合中的顶部项目

java - SQL 查询从 MySQL 数据库表的日期期间检索数据,其中两个日期之一具有固定月份

sql - 在两个表上使用联合

mysql - Sql查询最多保留2条重复记录

php - Laravel 未定义偏移量 : 2 in for loop

php - 如何使用 php my sql 将大视频上传到数据库并在页面上获取

php - 设置mysql "search"页面

sql - 在 Oracle SQL 中排除/忽略周末