繁体   English   中英

mySql - 基于关键字的搜索查询

[英]mySql - search query based on keywords

我无法找到真正帮助我的东西。 我有一个具有以下结构的数据库:

在此输入图像描述

以及一个简单的查询来搜索和显示来自DB的一些结果:

if ($_REQUEST['search']) {
    $q = $_REQUEST['search'];
    $q_comma = explode(", ", $q);
    $where_in_set = '';
    $count = count($q_comma);

    foreach ($q_comma as $q) {
        $counter++;
        if ($counter == $count) {
            $where_in_set .= "FIND_IN_SET('$q','keywords')";
        } else {
            $where_in_set .= "FIND_IN_SET('$q','keywords') AND ";
        }
    }


    $sql_res = "select link, description, keyword from myDB where $where_in_set or description like '%$q%'";

这段代码有效,但不是我想要的。

在关键字列中,我有不同的逗号分隔关键字,即使订单不同,我也希望能够搜索它们。

这是一个例子:假设我已进入我的关键字列

谷歌,脸书,推特

使用我当前的代码,如果我键入Google,我可以看到结果,但如果我输入twitter,我看不到它。

我是否可以做任何事情来使其工作而不考虑关键字的顺序,但也有一个非常快速的搜索?

任何帮助将非常感激。

PS。 如果可能的话,我想只保留一个数据库,因为我读到了创建一个只有ID和关键字的新表,并且在我的搜索中加入了ID上的表,但如果可能的话,我希望有更好的解决方案。

谢谢

编辑

一些更新:

  1. 正如@Frayne Konok指出的那样,我以小写形式查询,并且db中的所有值都是小写的,所以情况不可能是问题
  2. 正如@mkaatman所建议的那样,我围绕反引号包装了keyword列(`)
  3. 我更改了我的查询,现在它看起来像@ user2272989在答案中建议的那个

所以我的查询现在看起来像这样:

select link, description, keyword from myDB
where (FIND_IN_SET('google',`keyword`) or
       FIND_IN_SET('facebook', `keyword`) or 
       FIND_IN_SET('twitter', `keyword`))
       OR description like 'google, facebook, twitter'

即使订单不同,它也会返回值,但它不会只显示我想要的值。 例如,如果我写twitter,google,facebook,我有一个类似28行的返回,其中只有2行将所有三个单词作为关键字,而另一个我只有一两个

编辑2 - 更新

我只是想“重新开启”这个问题,因为我没有设法解决这个问题。 如果我将所有关键字更改为对象,那么最好将它们用作关键字吗? 或者在数据库中搜索关键字的绝对最佳和更可靠的方法是什么? 拥有不同的DB并使用INNER JOIN?

在这一点上,我愿意改变结构和代码,如果它有帮助。

谢谢

这可能对你有所帮助

$sql_res = "select link, description, keyword from myDB 
      where (FIND_IN_SET('yahoo',keyword) or
             FIND_IN_SET('twitter',keyword)) or 
             description like '%$q%'";

您在FIND_IN_SET中使用AND条件

我最终在这里使用这个结构和查询:

$q = $_REQUEST['search'];
$q_comma = array_filter(explode(' ', str_replace(',', ' ', $q)));
$count = count($q_comma);
$dbQuery = "select id, link, description, tags from db where ";
$searchTerms = '';

foreach ($q_comma as $q) {
    $counter++;
    if ($counter == 1) {
        $searchTerms .= "tags LIKE '%$q%'";
    } else {
        $searchTerms .= "and tags LIKE '%$q%'";
    }
}


$sql_res = $dbQuery . $searchTerms;
$result = mysqli_query($db, $sql_res) or die(mysqli_error($db));
$return_arr = array();
$data = array();
if (mysqli_num_rows($result) == 0) {
    echo "Nothing";
} else {
    while ($row = mysqli_fetch_object($result)) {
        $data[] = $row;
    }
    mysqli_free_result($result);
    echo json_encode($data);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM