我试图找到搜索多个列以查找单词出现的最佳方法。当然,一个选项是在查询中添加多个OR
:
SELECT * FROM table WHERE column1 LIKE %term1% OR column2 LIKE %term1% OR......
然而,我虽然这使得查询时间很长,特别是当有多个术语时
在我的搜索中,我遇到了MYSQL中的CONCAT
函数。这似乎允许我在连接列之后进行一次搜索(对吗?):
SELECT * FROM table WHERE CONCAT(column1,column2,....) LIKE %term1% OR CONCAT(column 1,column2,...) LIKE %term2% ....
这具有易于阅读和维护的进步
因为我还不了解CONCAT
的完整用法我不知道,或者这是一种正确的使用方式。我想知道实现这种搜索的正确和最有效的方法是什么。 (注意:我还计划按照此stackoverflow问题中的说明进行排序:mysql SORT BY amount of unique word matches,maby在使用方法时遇到问题?)
修改
Maby会更容易解释我的最终愿望:在php中我有一系列单词。我希望从我的数据库中选择所有行,其中1个单词出现在多个colmuns之一中,然后按相关性对它们进行排序(甚至对某些列添加额外的重要性)。 (请注意,搜索行只有几千(少于5000)行)
答案 0 :(得分:2)
因为我认为这是一个有趣的观点,我认为最好的尝试是好的。
好吧,在你编辑之后,似乎你没有那么多数据,但我仍然会发布结果:
编辑:这是我第一次尝试MySQL测试,而且正如@Alma Do所说,那些结果"可能只是波动"。
首次查询(90000行)road
和road2
为VARCHAR(100)
:
SELECT * FROM adress WHERE CONCAT(road1,road2) LIKE '%test%';
0.0503秒
SELECT * FROM adress WHERE road1 LIKE '%test%' OR road2 LIKE '%test%';
0.0710秒
似乎确实有多个LIKE
资源丰富。我对MySQL
资源验证没有那么好,所以我没有进一步研究这个问题,猜测它还应该提出一个想法。
我看到的主要问题是如果CONCAT
可能会造成错误匹配:
SELECT CONCAT('fooa','bfoo')
的 LIKE '%ab%'
可以正常工作,而'fooa' LIKE '%ab% OR 'bfoo' LIKE '%ab% OR
则不会。
对于500行,我不认为你会遇到资源问题,所以我会选择那些更容易阅读和维护的东西。
希望有所帮助
答案 1 :(得分:0)
最好的方法是使用全文搜索引擎完成该任务,或使用MySQL的全文功能。
你可以在这里找到更多解释: fulltext-natural-language