Mysql LIKE子句和字段中单独的单词


Mysql LIKE clause and separate words in a field

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

select * from table where title like %search_term%

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

是否有一种方法可以让它在用户搜索多个单词时返回结果?LIKE是正确的东西在这里使用或有其他东西可以使用?

您可以使用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。

使用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)

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

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

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

最好的方法是使用基于空格分割搜索字符串来执行联合操作,

FOR Acme 5 pound,

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传递查询数据库,所以它应该很容易为您。

<?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%'