我无法找到真正帮助我解决这个问题的任何事情。 我有一个具有以下结构的数据库:
和一个简单的查询来搜索和显示来自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,Facebook,twitter
使用我当前的代码,如果我输入Google,我可以看到结果,但如果我输入twitter,我就看不到了。
在没有考虑关键字的顺序的情况下,我可以做些什么来使它工作,但是搜索速度也非常快?
任何帮助都将非常感激。
PS。我想尽可能只保留一个数据库,因为我读到了创建一个只有ID和关键字的新表格,并且在我的搜索中加入了ID上的表格,但我更喜欢更好的解决方案如果可能的话。
由于
修改
一些更新:
keyword
列(`)所以我的查询现在看起来像这样:
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?
此时我愿意改变结构和代码,如果有帮助的话。
由于
答案 0 :(得分:0)
这可能对您有所帮助
$sql_res = "select link, description, keyword from myDB
where (FIND_IN_SET('yahoo',keyword) or
FIND_IN_SET('twitter',keyword)) or
description like '%$q%'";
您在AND
FIND_IN_SET
条件
答案 1 :(得分:0)
我最终在这里使用了这个结构和查询:
$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);
}