4

我目前使用如下所示的 mysql 语句来搜索帖子标题。

select * from table where title like %search_term%

但问题是,如果标题是:Acme launches 5 pound burger并且用户搜索了Acme,它将返回一个结果。但如果用户搜索Acme burgeror Acme 5 pound,它不会返回任何内容。

当用户搜索多个单词时,有没有办法让它返回结果?在这里使用正确LIKE的东西还是可以使用其他东西?

4

5 回答 5

5

要针对文本集合搜索字符串,请使用 MATCH() 和 AGAINST()

SELECT * FROM table WHERE MATCH(title) AGAINST('+Acme burger*')

或者为什么不 RLIKE

SELECT * FROM table WHERE TITLE RLIKE 'Acme|burger'

或 LIKE 搜索数组,以编译 $keys

$keys=array('Acme','burger','pound');
$mysql = array('0');
foreach($keys as $key){
    $mysql[] = 'title LIKE %'.$key.'%'
}
SELECT * FROM table WHERE '.implode(" OR ", $mysql)
于 2013-04-07T07:40:27.813 回答
5

您可以使用 REGEXP 匹配搜索字符串中的任何单词:

select *
from tbl
where
  title REGEXP CONCAT('[[:<:]](', REPLACE('Acme burger', ' ', '|'), ')[[:>:]]')

请注意,这不会非常有效。在这里看小提琴。

如果您需要匹配字符串中的每个单词,可以使用如下查询:

select *
from tbl
where
  title REGEXP CONCAT('[[:<:]]', REPLACE('Acme burger', ' ', '[[:>:]].*[[:<:]]'), '[[:>:]]')

在这里拉小提琴。但是单词必须按正确的顺序排列(例如,'Acme burger' 会匹配,'burger Acme' 不会)。有一个 REGEXP 可以按任何顺序匹配每个单词,但 MySql 不支持它,除非您安装了支持 Perl regexp 的 UDF。

于 2013-04-07T08:30:40.517 回答
0

您需要做的是构造一个 SQL,例如:

select * from table where title like "%Acme%" and title like "%burger%"

简而言之:拆分字符串并like为每个部分创建一个。它也可以用 替换空格%,但我不确定。

于 2013-04-07T07:31:36.327 回答
0

最好的事情是通过基于空格拆分搜索字符串来执行联合操作,

对于 Acme 5 磅,

SELECT * FROM TABLE WHERE TITLE LIKE '%ACME 5 POUND%'
UNION
SELECT * FROM TABLE WHERE TITLE LIKE '%ACME%'
UNION
SELECT * FROM TABLE WHERE TITLE LIKE '%5%'
UNION
SELECT * FROM TABLE WHERE TITLE LIKE '%POUND%'

找出一种方法来优先考虑第一个查询。或者将上述一个作为具有一定优先级的四个单独的查询传递。我认为您正在使用前端 tp 传递查询到数据库,所以对您来说应该很容易。

于 2013-04-07T07:38:17.187 回答
0
<?php
$search_term = 'test1 test2 test3';
$keywords = explode(" ", preg_replace("/\s+/", " ", $search_term));
foreach($keywords as $keyword){
 $wherelike[] = "title LIKE '%$keyword%' ";
}
$where = implode(" and ", $wherelike);

$query = "select * from table where $where";

echo $query;
//select * from table where title LIKE '%test1%' and title LIKE '%test2%' and title LIKE '%test3%' 
于 2013-04-07T07:38:44.720 回答