【问题标题】:mySql - search query based on keywordsmySql - 基于关键字的搜索查询
【发布时间】:2016-03-08 16:45:52
【问题描述】:

我找不到任何真正帮助我解决这个问题的东西。 我有一个具有以下结构的数据库:

还有一个简单的查询来搜索和显示来自数据库的一些结果:

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 所指出的,我的查询是小写的,数据库中的所有值也是小写的,所以大小写不是问题
  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'

即使顺序不同,它也会返回值,但它不仅仅显示我想要的值。 例如,如果我写推特、谷歌、脸书,我有 28 行作为返回值,其中只有 2 个将三个单词全部作为关键字,而另一个只有一个或两个

编辑 2 - 更新

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

此时,如果有帮助,我愿意更改结构和代码。

谢谢

【问题讨论】:

  • 这行得通吗? SELECT FIND_IN_SET('Twitter','Google,Facebook,Twitter'); 我会在 foreach 内部 var_dump($q); 确保您正在检查您认为正在检查的内容。另外,我不认为关键字应该用引号括起来。
  • case 可能是问题所在,您可以在description 中尝试LOWER。例如:LOWER(description) like '%$q%'。还有strtolower$q
  • @mkaatman 没有引号中的关键字我有一个语法错误说“表中的未知列关键字”
  • @FrayneKonok 我已经在降低查询和数据库,但感谢您指出这一点
  • @Nick 您需要使用反引号而不是引号。 `

标签: php mysql


【解决方案1】:

这可能对你有帮助

$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 条件

【讨论】:

  • 您的示例并没有真正按照我的需要进行过滤...如果我输入 google、facebook,它会显示所有正确的行,但如果我添加例如 twitter,它仍然会显示所有即使我只有 1 个包含所有 3 个关键字的行
【解决方案2】:

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

$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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多