Php Mysql-LIKE子句和字段中的独立单词
我目前使用类似下面的mysql语句来搜索帖子标题Php Mysql-LIKE子句和字段中的独立单词,php,mysql,sql,Php,Mysql,Sql,我目前使用类似下面的mysql语句来搜索帖子标题 从标题为%search\u term%的表格中选择* 但问题是,如果标题是这样的:Acme推出5磅汉堡,用户搜索Acme,它将返回一个结果。但如果用户搜索了acmeburger或acme5磅,则不会返回任何结果 当用户搜索多个单词时,有没有办法让它返回结果?LIKE是在这里使用的正确方法还是可以使用其他方法?您需要做的是构造一个SQL,例如: select * from table where title like "%Acme%" and ti
从标题为%search\u term%的表格中选择*
但问题是,如果标题是这样的:Acme推出5磅汉堡
,用户搜索Acme
,它将返回一个结果。但如果用户搜索了acmeburger
或acme5磅
,则不会返回任何结果
当用户搜索多个单词时,有没有办法让它返回结果?
LIKE
是在这里使用的正确方法还是可以使用其他方法?您需要做的是构造一个SQL,例如:
select * from table where title like "%Acme%" and title like "%burger%"
简而言之:拆分字符串并为每个部分创建一个类似的。
它还可以用%
替换空格,但我不确定这一点。最好的方法是使用执行联合操作,根据空格分割搜索字符串
对于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 pass查询数据库,因此对您来说应该很容易。要根据文本集合搜索字符串,请使用MATCH()和antch()
<?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%'
或者为什么不喜欢
SELECT * FROM table WHERE TITLE RLIKE 'Acme|burger'
或者像搜索数组一样,编译$keys
$keys=array('Acme','burger','pound');
$mysql = array('0');
foreach($keys as $key){
$mysql[] = 'title LIKE %'.$key.'%'
}
SELECT * FROM table WHERE '.implode(" OR ", $mysql)
您可以使用REGEXP匹配搜索字符串中的任何单词:
select *
from tbl
where
title REGEXP CONCAT('[[:<:]](', REPLACE('Acme burger', ' ', '|'), ')[[:>:]]')
选择*
来自tbl
哪里
标题REGEXP CONCAT(“[[::]]”)
请注意,这将不是很有效。看小提琴
如果需要匹配字符串中的每个单词,可以使用如下查询:
select *
from tbl
where
title REGEXP CONCAT('[[:<:]]', REPLACE('Acme burger', ' ', '[[:>:]].*[[:<:]]'), '[[:>:]]')
选择*
来自tbl
哪里
title REGEXP CONCAT(“[[::].[[::]]”)
小提琴。但是单词的顺序必须正确(例如,“Acme burger”会匹配,“burger Acme”不会匹配)。有一个REGEXP可以按任何顺序匹配每个单词,但MySql不支持它,除非您安装了一个支持Perl REGEXP的UDF。如何与全文索引进行匹配?您需要一个全文索引。@nl-x全文索引是什么意思?列类型应为文本?现在是varchar我试过你的匹配方法。但即使在搜索“acme汉堡”时,也会返回所有带有acme字样的内容。但这是一个很好的匹配。为什么不使用或而不是联合
?是的,你可以这样做。“但我不知道哪一个会有效。当你搜索acme汉堡时,它也会返回每个带有acme字样的标题。”诺曼更新了我的答案。但是,如果您需要以任何顺序匹配每个单词,则有一个regexp,但MySql不支持它…因此需要另一个解决方案在MySql中有这样做的方法吗?
select *
from tbl
where
title REGEXP CONCAT('[[:<:]]', REPLACE('Acme burger', ' ', '[[:>:]].*[[:<:]]'), '[[:>:]]')