php - mysql查询的对称差或析取联合
问题描述
如果客户搜索两个或多个关键字,我需要返回两组 MySQL 结果:
1)主要结果:这些关键字的交集(仅匹配所有关键字的项目)
2)次要结果:匹配关键字的对称差/析取并集的项目(匹配部分但不是所有关键字的项目)
我可以使用 BOOLEAN 模式执行查询 #1 +
,每个关键字前都有一个符号。我可以通过关闭签名来执行包含#1 和#2 的查询+
,但我不知道如何获得#2 中描述的所需结果。有什么建议么?
解决方案
对于#2,您只需要以下组合:
WHERE MATCH(words) AGAINST('keyword1 keyword2 ... keywordN' IN BOOLEAN MODE)
AND NOT MATCH(words) AGAINST('+keyword1 +keyword2 ... +keywordN IN BOOLEAN MODE)
这将返回至少有一个关键字但不是全部的行。还是我误解了你的问题?
架构 (MySQL v8.0)
create table test (
id int not null auto_increment primary key,
words text not null,
FULLTEXT idx (words)
);
insert into test(words)
values('Arc Book Cow Dog'), ('Book Cow Fox'), ('Arc Book Cow Fox'), ('Book Cow');
查询 #1
SELECT *
FROM test
WHERE MATCH(words) AGAINST('Arc Fox' IN BOOLEAN MODE)
AND NOT MATCH(words) AGAINST('+ARC +Fox' IN BOOLEAN MODE)
ORDER BY id;
| id | words |
| --- | ---------------- |
| 1 | Arc Book Cow Dog |
| 2 | Book Cow Fox |
推荐阅读
- c++ - QSortFilterProxyModel 和 setDynamicSortFilter
- mailkit - 查找 gmail 中最旧邮件的日期
- swift - 如何在swift中的数据更改后更改变量
- twilio - Twilio:有没有办法导出所有选择退出?
- c++ - 为什么 MOCK_METHOD 语法在 GMock 中不起作用?
- c++ - 没有与两种类型的字符串匹配的函数调用
- python - 如何在不使用睡眠功能的情况下每 N 次做 X 次?
- .net - 在寓言中打印具有相同宽度的正负整数
- bitbucket-pipelines - Bitbucket Pipeline:主机密钥不匹配(在 RSA 之前首选 ECDSA)
- hadoop - 使用和不使用 MapReduce 组合器的 Hadoop 文件系统计数器