我目前使用下面的mysql语句来搜索帖子标题。
select * from table where title like %search_term%
但问题是,如果标题是:Acme launches 5 pound burger
,用户搜索Acme
,它将返回一个结果。但是如果用户搜索Acme burger
或Acme 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%'