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

时间:2013-04-07 07:27:17

标签: php mysql sql

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

select * from table where title like %search_term%

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

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

5 个答案:

答案 0 :(得分:5)

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

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

请注意,这不会非常有效。请参阅小提琴here

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

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

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

答案 1 :(得分:4)

要搜索文本集合的字符串,请使用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)

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分: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%'