MySQL和PHP:多关键字搜索

Rap*_*tor 12 php mysql

我有一个包含逗号分隔关键字的字符串.例如:

$keywords = 'keyword1, keyword2, keyword3';
Run Code Online (Sandbox Code Playgroud)

我的表模式,命名tbl_address是这样的(简化):

id        INT(11)        PRIMARY KEY, AUTO INCREMENT
address   VARCHAR(250)   NOT NULL
Run Code Online (Sandbox Code Playgroud)

假设我必须MySQLi在PHP(而不是PDO)中使用.

这是我目前的做法:

$result = array();
$keyword_tokens = explode(',', $keywords);
foreach($keyword_tokens as $keyword) {
  $keyword = mysqli_real_escape_string(trim($keyword));
  $sql = "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%'";
  // query and collect the result to $result
  // before inserting to $result, check if the id exists in $result.
  // if yes, skip.
}
return $result;
Run Code Online (Sandbox Code Playgroud)

这种方法有效,但性能效率低下.如果有很多关键字,它会产生很多查询.

我的问题是,有没有更好的方法来实现同一目标?即,使用包含任意关键字的地址返回所有记录的最简单方法是什么?

Jim*_*mbo 25

一个简单的REGEXP可能就是你所追求的.你必须检查它对你自己的效率.

SELECT * FROM tbl_address WHERE field REGEXP 'keyword1|keyword2|keyword3';


Str*_*rry 5

 SELECT * FROM user;
 +---------+----------+
 | user_id | username |
 +---------+----------+
 |     101 | Adam     |
 |     102 | Ben      |
 |     103 | Charlie  |
 |     104 | Dave     |
 +---------+----------+

 SELECT * 
   FROM user 
  WHERE FIND_IN_SET(username,'adam,ben,dave') > 0;
 +---------+----------+
 | user_id | username |
 +---------+----------+
 |     101 | Adam     |
 |     102 | Ben      |
 |     104 | Dave     |
 +---------+----------+
Run Code Online (Sandbox Code Playgroud)