Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何最好地在MySQL中使用PHP和JS搜索特定标记_Javascript_Php_Mysql_Arrays_Ajax - Fatal编程技术网

Javascript 如何最好地在MySQL中使用PHP和JS搜索特定标记

Javascript 如何最好地在MySQL中使用PHP和JS搜索特定标记,javascript,php,mysql,arrays,ajax,Javascript,Php,Mysql,Arrays,Ajax,如何最好地搜索一个只有用户搜索的标签的项目,无论它是包含所有标签还是仅包含部分标签 例如: 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

如何最好地搜索一个只有用户搜索的标签的项目,无论它是包含所有标签还是仅包含部分标签

例如:

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\u para[$key])等参数循环查询整个表。
一次查询一个参数。每次匹配参数时,都会将项id添加到数组中

3:循环完成后,算法计算一个项目id在数组中出现的次数,并与主表中的标记数进行比较。如果它小于存储的编号(因此用户想要的标签以外的其他内容位于该项中),则数组将删除该项的所有id并检查下一个id

我觉得这还是很糟糕。有什么更好的解决方案


我把JS/AJAX放在标签中,因为我想知道前端可以做什么,而不是把更多的压力放在后端。

1。将从用户那里获得的参数拆分成一个数组,并构建SQL查询的
WHERE
部分。假设用户需要参数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查询,该查询将为您提供按项分组的所有参数。请注意,
$where
位于底部

select * from(
    select item, GROUP_CONCAT(param) as params
    from tbl
    group by item
) t
where params like '%a%' or params like '%b%'

3.现在,您拥有至少具有用户请求的一个参数的所有项目。最后一步是循环遍历结果,去掉那些带有用户从未要求的参数的结果

假设所有返回的db记录都放在
$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
是满足您要求的先前结果集的子集。

请澄清。如果用户搜索
c,d,e,f,g,h
,则具有
c,d,k
的项目是否匹配?否,因为k不在用户的搜索参数中确定我得到了它。我的方法和你的有点不同,但应该有效。似乎比我的方法简单一些。我到家后会试试的。我需要更多地使用查询命令,我不知道还有像group_concat这样的功能。@J13t0u它比您建议的要简单得多:它不依赖于第二个表,更重要的是它不依赖于在循环中执行多个查询(这也使它变得更快)。SQL真的很强大;如果有一种方法可以通过正确的查询得到您想要的确切结果,我不会感到惊讶。我只是还没有那个技能水平。我在这里问了另一个问题,先让你的方法工作,然后尝试他的查询。@J13t0u如果你选择尝试实现我的解决方案,请选择它。在我的帖子中,它可能看起来不像,但要为这样的问题制定一个精益解决方案,测试它,然后为您的利益编写说明,需要很长时间。关于你的另一个问题:我认为你得到了一个相当聪明的答案;如果不亲自做一些研究,我不知道该怎么做。哦,是的,忘了选择它了。试图将其转换为PDO,这是一种痛苦。
$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;
}