【发布时间】:2014-09-13 08:15:05
【问题描述】:
我试图找到在多个列中搜索单词出现的最佳方法。当然,一个选项是在查询中添加多个OR:
SELECT * FROM table WHERE column1 LIKE %term1% OR column2 LIKE %term1% OR......
但我虽然这使查询变得很长,尤其是当有多个术语时
在我的搜索中,我发现了 MYSQL 中的 CONCATfunction。这似乎允许我在连接列后进行一次搜索(对吗?):
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,可能在使用这种方法时会出现问题?)
编辑:
也许只解释我的最终愿望会更容易:在 php 中,我有一个单词数组。我希望从我的数据库中选择所有行,其中 1 个单词出现在多个 colmun 之一中,然后按相关性对它们进行排序(甚至为某些列添加额外的重要性)。 (请注意,只有几千(少于 5000)行要搜索)
【问题讨论】:
-
有趣。在任何一种情况下,查找匹配行都会很慢(因为由于 LIKE 中的前导通配符,它不会使用索引)。这可能意味着对长字符串执行单个like 可能会更快。不利的一面是,如果您搜索术语 ME if 还会找到 column1 以 M 结尾且 column2 以 E 开头的行
-
@Kickstart : 如果通配符被跳过怎么办? ME问题可以通过concat_ws解决,不是吗?
-
我会坚持第一个选项,但我没有什么可以支持我的观点,除非你可能会得到错误的结果。例如:第 1 列:Rapido,第 2 列:太好了,您最终会得到 RapidoGreat,并且您将匹配“狗”。
-
Concat_ws 修复它,直到用户碰巧搜索包含您选择使用的分隔符的字符串。前导通配符的问题是 MySQL 不能使用索引来查找它们(它可能可以使用尾随通配符)。如果没有前导通配符,则使用大量 OR 将允许使用索引,但将字段连接在一起将确保仍需要前导通配符。
-
帖子末尾的“按相关性排序”会立即导致“全文”作为解决方案。这就是它的意图。但是如果你不能使用它,因为你的 InnoDB 版本不支持它是的 - 那么,好的,最好的建议:将你的 MySQL 服务器升级到 5.6。否则,您将始终围绕着这种神秘的解决方案。从性能的角度来看
OR LIKE可能使用索引,但这不能保证,通常情况下不会。因此,双向方式很糟糕,唯一重要的可能是可读性。这是您的决定。
标签: mysql multiple-columns concat