mysql - FULLTEX在Mysql中不同表的两列上搜索
问题描述
谁能帮我找到全文搜索的查询?我有两列产品和通用。
表-产品:
1. ProductID (Integer)
2. GenericID (Integer)-FK
3. Product_Name (Varchar)
在通用表中:
1. GenericID (Integer)
2. Generic_Name (Varchar)
我需要的是使用 Product_Name 和 Generic_Name 的组合名称搜索输入字符串。
我的示例查询如下
SELECT
prod.ProductID AS ID,
generic.Generic_Name AS genericName,
prod.Product_Name AS packageName
FROM
Product prod
INNER JOIN
Generic generic ON prod.GenericID = generic.GenericID
WHERE
MATCH (prod.Product_Name ,generic.Generic_Name) AGAINST('+acb* +ace* +serr* +para*' IN BOOLEAN MODE)
ORDER BY prod.Product_Name ASC
它不起作用,因为这些列位于不同的表中。
解决方案
FULLTEXT 搜索操作每个都使用 FULLTEXT 索引。该索引只能在一个表上。
因此,您可以尝试使用两个全文搜索操作...
WHERE (
match(prod.Product_Name) against('+acb* +ace* +serr* +para*' in boolean mode)
OR
match(generic.Generic_Name) against('+acb* +ace* +serr* +para*' in boolean mode)
)
或者,为了获得最佳性能和结果集排名,您可以name
像这样构建一个新表
GenericId NOT a primary key
IsGeneric 1 or 0
Name either Product_Name or Generic_Name
您将通过合并其他两个表中的名称来构造此表。例如,它可能包含
4321 0 Advil
4321 0 Motrin
4321 1 Ibuprofen
4322 0 Coumadin
4322 1 Warfarin
然后,像这样的查询就可以了
select prod.ProductID AS ID,
generic.Generic_Name AS genericName,
prod.Product_Name AS packageName
FROM Product prod
INNER JOIN Generic generic ON prod.GenericID = generic.GenericID
INNER JOIN Name ON Name.GenericID = prod.GenericID
WHERE MATCH(Name.Name) AGAINST('+acb* +ace* +serr* +para*' in boolean mode)
ORDER BY prod.Product_Name ASC
第二种选择是更多的编程工作。但是,因为它将商品名和通用名都放在一个全文索引中,它会更快并且可能会提供更好的结果。
推荐阅读
- azure-devops-server-2019 - 如何删除阻止删除存储库的文件锁?
- python - 使用 elif 打印用户是否访问过超过 2 个大洲但少于 6 个
- react-native - 更改为新路线时更改圆圈的动画大小
- c# - 单元测试 - 进程没有包 ID
- javascript - JSON正文上的正则表达式 - 兄弟
- javascript - 有人可以解释一下这段代码的第二部分吗?
- python - Python:保持和检查两个徽标是否相同与其方向无关的最佳方法
- java - 如何在多播()中的骆驼路由中持久化标头或属性?
- user-controls - 将用户限制在 bitbucket 中的单个工作区
- javascript - 如何在 Javascript 中转置对象数组?