Php 基于关键字的mySql搜索查询
我找不到任何对我有帮助的东西。 我有一个具有以下结构的数据库: 以及一个简单的查询,用于搜索和显示数据库中的一些结果:Php 基于关键字的mySql搜索查询,php,mysql,Php,Mysql,我找不到任何对我有帮助的东西。 我有一个具有以下结构的数据库: 以及一个简单的查询,用于搜索和显示数据库中的一些结果: if ($_REQUEST['search']) { $q = $_REQUEST['search']; $q_comma = explode(", ", $q); $where_in_set = ''; $count = count($q_comma); foreach ($q_comma as $q) { $cou
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%'";
这段代码可以工作,但不是我想要的
在关键字列中,我有不同的逗号分隔关键字,我希望能够搜索它们,即使顺序不同
这里有一个例子:假设我已经进入我的关键字列
谷歌、Facebook、twitter
用我当前的代码,如果我输入Google,我可以看到结果,但是如果我输入twitter,我看不到结果
我能做些什么来让它工作,而不考虑关键字的顺序,但也有一个相当快的搜索
任何帮助都将不胜感激
另外,如果可能的话,我只想保留一个DB,因为我读到了关于创建一个只有ID和关键字的新表的内容,并且在我的搜索中加入ID上的表,但是如果可能的话,我更喜欢一个更好的解决方案
谢谢
编辑
一些更新:
关键字
列包装在backticks(`)周围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-更新
我只是想“重新打开”这个问题,因为我没能解决这个问题。如果我将所有关键字都更改为一个对象,那么将它们用作关键字会更好吗?或者,在数据库中搜索关键字的绝对最佳和更可靠的方法是什么?使用不同的DBs并使用内部联接
在这一点上,如果有帮助的话,我愿意改变结构和代码
谢谢这可能对你有帮助
$sql_res = "select link, description, keyword from myDB
where (FIND_IN_SET('yahoo',keyword) or
FIND_IN_SET('twitter',keyword)) or
description like '%$q%'";
您在
集合中查找中使用了和条件
$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);
}
这行吗<代码>选择查找集合中的搜索(“推特”、“谷歌、Facebook、推特”)代码>我将变量转储($q)代码>就在foreach中,以确保您正在检查您认为正在检查的内容。此外,我认为关键字不应该用引号括起来。如果有问题,您可以尝试在说明中使用较低的。例如:LOWER(description)如“%$q%”
。另外,strtolower
在引号中没有关键字的$q
@mkaatman我有一个语法错误,说“表中的未知列关键字”@FrayneKonok我已经在降低查询和我的数据库,但感谢您指出这一点out@Nick您需要使用反勾号而不是引号`用你的例子并不能像我需要的那样进行过滤……如果我输入google、facebook,它会显示所有正确的行,但是如果我添加twitter等,它仍然会显示所有的行,即使我只有1个,3个关键字都在一起