我有一个包含逗号分隔关键字的字符串.例如:
$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';
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)
| 归档时间: |
|
| 查看次数: |
34782 次 |
| 最近记录: |