【问题标题】:How to search for multiple keywords using sql search如何使用sql搜索搜索多个关键字
【发布时间】:2019-11-05 08:32:42
【问题描述】:

我有一个当前的 SQL 搜索查询,允许用户输入关键字来搜索我的 SQL 数据库。目前,搜索将使用多个单词,但将显示任一关键字的所有结果。如果您输入“Ford Mustang”,它将显示所有包含“Ford”或“Mustang”的结果,但我需要它只显示同时显示“Ford”和“Mustang”的结果。

我尝试过的如下

public function getProductByName($name){
    $stmt = $this->pdo->prepare('SELECT * FROM tbl_products WHERE name REGEXP :names');
    $names = "[[:<:]](" . str_replace(" ", "|", $name) . ")[[:>:]]";
    $stmt->execute(array('names' => $names));
    return $stmt;
}

【问题讨论】:

  • 您使用的是哪个 dbms? (REGEXP 通常有点特定于产品。)
  • 我正在使用 mySQL 并在我的服务器上使用 PHP 来执行实际的搜索功能
  • Au Nguyen,那个帖子没有回答我的问题

标签: php sql


【解决方案1】:

也许这就是你要找的东西

select * from example where name like "%mustang%ford%"

【讨论】:

  • 我需要按照上面的示例代码在 PHP 中进行。此外,实际的搜索词会因用户输入而异
  • 把查询放在$stmt里面,如果你想使用用户输入,那么你可以通过$name来查询类似$stmt = $this-&gt;pdo-&gt;prepare('SELECT * FROM tbl_products WHERE name like "%' .$name.%"');的东西
  • 我已经尝试过这种方式并且它有效,但只能按单词顺序,即如果用户输入“Ford Mustang”,那么它将按该顺序搜索Ford 和Mustang。如果数据是“福特是野马”,则不会显示搜索结果,因为福特和野马彼此之间不是文本
  • select * from example where name REGEXP "^(?=.*ford)(?=.*mustang).*$" 通过输入更改福特和野马。 ^ means start of line, $ means end of line, ?= means lookahead, .* means match any characters
  • edit : 在ford/mustang(input) 前加上? 使其懒惰搜索,所以当找到input select * from example where name REGEXP "^(?=.*?ford)(?=.*?mustang)" 时它会停止搜索
【解决方案2】:

你可以写查询

select * from tbl_products where name like "%Mustang%" and name like "%ford%";

PHP 代码

//you may split search string like
$searchArray = explode(' ', $name);

//for loop for preparing the query
$query = 'SELECT * FROM tbl_products WHERE ';
$searchParams = array();
$conditions = [];
for($searchArray as $searchStr){
    $conditions[] = 'name like ?';
    $searchParams[] = "%$searchStr%";
}

//attach the conditions
$query .= implode(" and ", $conditions);

//execute the query 
$stmt = $this->pdo->prepare($query);

$stmt->execute($searchParams);

【讨论】:

    猜你喜欢
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多