Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql-LIKE子句和字段中的独立单词_Php_Mysql_Sql - Fatal编程技术网

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

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

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

从标题为%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', ' ', '[[:>:]].*[[:<:]]'), '[[:>:]]')