如何在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放在标签中,因为我想知道在前端可以做些什么,而不是在后端加上更多的压力。

+0

请说明。如果用户搜索'c,d,e,f,g,h',那么具有'c,d,k'的项目是否匹配? – BeetleJuice

+0

不,因为k不在用户的搜索参数 – J13t0u

+0

好吧,我明白了。我的方法与你有些不同,但应该有效。 – BeetleJuice

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%' 

See the result set

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数据库记录是集以前的结果集满足您的要求。

+0

似乎比我的简单。当我回家时,我会试试看。我需要更多地使用查询命令,我不知道有像group_concat这样的功能。 – J13t0u

+0

@ J13t0u它比你建议的要简单得多:它不依赖于第二个表,更重要的是它不依赖于在循环中执行多个查询(这也使得这个速度快得多)。 SQL非常强大;如果有一种方法可以通过正确的查询来获得准确的结果,我不会感到惊讶。我还没有那个技能水平。 – BeetleJuice

+0

我问了另一个问题在这里http://*.com/questions/38576706/how-to-find-out-how-many-times-a-mysql-comparison-query-returns-true-and-false/ 去先让你的方法工作,然后尝试他的查询。 – J13t0u