【问题标题】:How to make a good sql search with like如何使用like进行良好的sql搜索
【发布时间】:2017-09-24 19:46:40
【问题描述】:

多年来,当我希望我的用户搜索我的数据库中的某个字段时,他可以在其中输入他想要的任何内容,我使用一种算法来分解单词并分别搜索每个单词......一团糟。

例如,如果用户在搜索框中输入“aaa bbb ccc”我不喜欢使用:

SELECT id 
  FROM table 
 WHERE description LIKE '%aaa bbb ccc%'

因为有时用户输入的东西乱序,上面的查询会找不到。我通常做的是打破字符串并将其与 PHP 连接,因此结果变为:

SELECT id 
  FROM table 
 WHERE description LIKE '%aaa%' 
   AND description LIKE '%bbb%' 
   AND description LIKE '%ccc%'

但今天在和朋友交谈后,我想知道是否有一些本地方法可以使用 MY SQL 更快地完成此操作?

【问题讨论】:

  • 是的,这叫full text search
  • @SergioTulentsev "在 WHERE 子句中使用 MATCH() 时,如前面所示的示例,返回的行将自动按照相关性最高的顺序进行排序。太好了!!!!如果您发布答案,我会接受它!我从来没有意识到这一点,它非常神奇!
  • SELECT * FROM table WHERE MATCH (description) AGAINST ('aaa bbb ccc' IN NATURAL LANGUAGE MODE);试试这个,告诉我结果。

标签: mysql sql


【解决方案1】:

你想要做的叫做full text search,现在大多数关系数据库都支持它,包括mysql。

【讨论】:

  • 你知道有什么好的参考吗? Mysql 页面太混乱了,我发现的其他页面提供了相互矛盾的例子......他们中的大多数人说全文搜索总是返回结果,即使用户输入的许多单词中只有一个单词。
  • mysql 文档是 参考。 :)
  • 我读了很多书,但我仍然找不到我的问题的答案......因为使用你建议的答案有时它会返回结果,而不是所有的单词。例如,用户搜索“aaa bbb ccc”仍会返回仅包含“aaa bbb”的结果!我正在使用这个 -> SELECT * FROM itens_cadastrados WHERE MATCH(titulo) AGAINST("aaa bbb ccc")
  • @Samul:我确信这只是应用适当的查询修饰符的问题。 MATCH ALL而不是MATCH(什么的。我只是把这个修饰符弄好了,我自己没有用过mysql的全文搜索)
  • @Samul The documentation 非常清楚。有几个示例,最后加上 cmets 通常会添加更多上下文。
【解决方案2】:

我认为您可以使用 REGEXP。例如:

Select * from table where description REGEXP 'aaa|bbb|ccc'

【讨论】:

  • good ;) 但我认为这并没有像我正在使用的那样在一个巨大的数据库中进行优化(200k + 行,18 列)
【解决方案3】:

全文搜索非常快。 INSTR 或 locate 比 REGEXP 效果更好。但这取决于各种因素。 更多对比here

SELECT * from table where INSTR(description, 'aaa') >0 
SELECT * from table where LOCATE(description, 'aaa') >0 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多