mysql Concat vs OR

时间:2014-07-22 13:21:35

标签: mysql multiple-columns concat

我试图找到搜索多个列以查找单词出现的最佳方法。当然,一个选项是在查询中添加多个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)行)

2 个答案:

答案 0 :(得分:2)

因为我认为这是一个有趣的观点,我认为最好的尝试是好的。

好吧,在你编辑之后,似乎你没有那么多数据,但我仍然会发布结果:


编辑:这是我第一次尝试MySQL测试,而且正如@Alma Do所说,那些结果"可能只是波动"。


首次查询(90000行)roadroad2VARCHAR(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