【问题标题】:Search query optimization in mysqlmysql中的搜索查询优化
【发布时间】:2014-08-15 23:49:40
【问题描述】:

我正在处理搜索查询。 我的桌子上有一个字符串“thomas alva edison”。 如果用户搜索,我想显示这个字符串,

托马斯·阿尔瓦·爱迪生,托马斯,阿尔瓦,爱迪生,托马斯·阿尔瓦,托马斯·爱迪生等

但不是为了

tho,son,alv 等

我做的是

select name from tbl_names where name like "."'%".$key."%'

如何修改此查询以获得正确的结果。

【问题讨论】:

标签: php mysql


【解决方案1】:

我建议在查询中使用 REGEXP 进行单词搜索,

查询应该是这样的:

SELECT name FROM `tbl_names` WHERE `name` REGEXP '[[:<:]]thomas[[:>:]]'

希望这对您有用。更多详情请查看Check this answer

【讨论】:

  • 感谢这工作正常。搜索“thomas christopher,chris thomas,david thomas”时有什么方法可以返回“Thomas alva edison”
  • 不,当我们想要精确的输出时,正则表达式用于特殊情况,它不能作为“喜欢”来获取相关行!如果您需要建议,我建议您使用“LIKE”!
【解决方案2】:

MySQL 提供了一种实现小搜索的绝妙方法(全文搜索)。 http://viralpatel.net/blogs/full-text-search-using-mysql-full-text-search-capabilities/

例子:

select name from tbl_names WHERE MATCH (name) AGAINST ('thomas');

我们在全文搜索中有很多选项,而且只有 MySQL 5.6 MYISAM 引擎。

【讨论】:

  • 从 MySQL 5.6 开始,在 InnoDB 中也可以使用全文搜索。
【解决方案3】:

你也可以试试这样的:

$sql = "select name from tbl_names where ";
$array = explode(" ",$key);
$or = "";
foreach($array as $word) {
  if(strlen(trim($word))>0) {
    $sql.= $or."(name like '%".$word."%')";
    $or = " OR ";
  }
}

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多