如何在MySQL中使用PHP和JS搜索特定标签
如何最好地搜索仅包含用户搜索标签的项目,无论是具有所有标签还是只包含一些标签?如何在MySQL中使用PHP和JS搜索特定标签
因此,例如:
item | param
-----------------
1 | a
1 | b
1 | c
2 | b
2 | c
2 | d
3 | c
3 | d
3 | e
4 | d
4 | e
4 | f
项目1具有A,B,C;项目2有b,c,d;第3项有c,d,e;项目4具有d,e,f
用户输入到带有参数a,c,d,e,g的搜索栏中; 1和2有b和4有f,它们在用户参数之外。所以只有第3项,因为它只有c,d,e而没有别的,这3个参数属于用户的参数。它没有a或g,但没关系。
我只能想到一些方法来做到这一点。我能想到的最好的方法是:
1:在另一个表中,说出物品的主表,存储这个物品具有的标签的数量。
2:循环查询整个表,使用参数如WHERE (param=$user_para[$key])
一次参数。每次参数匹配时,项目标识符都会被添加到数组中。
3:循环结束后,算法会计算一个项目ID出现在数组中的次数,并与主表中的变量数进行比较。如果它小于存储的数字(所以用户想要的标签不在该项目中),那么数组将删除所有该项目ID并检查下一个。
我觉得这样还是很糟糕的。什么是更好的解决方案?
我把JS/AJAX放在标签中,因为我想知道在前端可以做些什么,而不是在后端加上更多的压力。
1.将您从用户获得的参数拆分为数组并构建WHERE
部分SQL查询。假设用户想要PARAMS a,b
:
$input = $_POST['params']; // eg: a,b
$params = explode(',', $input); // eg: [a,b]
$qry_params =[]; //holds the processed parameters
//todo: here you want to escape each input param to prevent SQL injection
foreach($params as $param) $qry_params[] = "params like '%$param%'";
//$where will be: where params like '%a%' or params like '%b%'
$where = " where ".implode(" or ",$qry_params);
2.使用SQL查询,这将使你的所有PARAMS按项目分组。需要注意的是$where
在底部
select * from(
select item, GROUP_CONCAT(param) as params
from tbl
group by item
) t
where params like '%a%' or params like '%b%'
item | params
-------------
1 | a,b,c,d
2 | e,d,c,b
3.现在你有两个具有PARAMS要求的用户的至少一个所有项目。最后一步是遍历结果,摆脱那些参数的用户从来没有要求
的假设全部返还被放在一个$rows
阵列
$matches = []; // final result
foreach($rows as $row){
$dbParams = explode(',', $row['params']); eg: [a,b,c,d] for item 1
//array_diff returns array of values in $dbParams not found in $params
//if there is no such value (db has no extras the user doesn't want)
//add the current row to matches.
if(!array_diff($dbParams,$params)) $matches[] = $row;
}
此时$matches
数据库记录是集以前的结果集满足您的要求。
似乎比我的简单。当我回家时,我会试试看。我需要更多地使用查询命令,我不知道有像group_concat这样的功能。 – J13t0u
@ J13t0u它比你建议的要简单得多:它不依赖于第二个表,更重要的是它不依赖于在循环中执行多个查询(这也使得这个速度快得多)。 SQL非常强大;如果有一种方法可以通过正确的查询来获得准确的结果,我不会感到惊讶。我还没有那个技能水平。 – BeetleJuice
我问了另一个问题在这里http://*.com/questions/38576706/how-to-find-out-how-many-times-a-mysql-comparison-query-returns-true-and-false/ 去先让你的方法工作,然后尝试他的查询。 – J13t0u
请说明。如果用户搜索'c,d,e,f,g,h',那么具有'c,d,k'的项目是否匹配? – BeetleJuice
不,因为k不在用户的搜索参数 – J13t0u
好吧,我明白了。我的方法与你有些不同,但应该有效。 – BeetleJuice