0

我在实现一些输出以回显来自数组的结果列表时遇到问题。我想创建一个实时搜索引擎,通过使用 AJAX 的 keyup-function 运行查询。

当输出将针对表中列出的每个匹配项进行回显时,一切正常。现在我想合并所有重复的条目。

代码如下:

$search_term = $_POST['search_term'];

$where = "";

$search_term = preg_split('/[\s]+/', $search_term, -1, PREG_SPLIT_NO_EMPTY);
$total_search_terms = count($search_term);

$total_search_term = 0;

foreach ($search_term as $key=>$value) {

    $total_search_term = $total_search_term + 1;

    if ($total_search_term === 1){
        if (is_numeric($value) ){
            $where .= "(`a` LIKE '%$value%')";
        } else {
            $where .= "(`b` LIKE '%$value%')";
        }
    }else if ($total_search_term > 1){
        $where .= " AND ";

        if (is_numeric($value) ){
            $where .= "(`a` LIKE '%$value%')";
        } else {
            $where .= "(`b` LIKE '%$value%')";
        }
    }   
}
$duplicate = $db->query("SELECT a, b, COUNT(*) counter
                        FROM `table`
                        GROUP BY a, b
                        HAVING COUNT(*) > 1
                        ");

$check = $duplicate->fetch_assoc();
$query = $db->query("SELECT a, b FROM table WHERE $where");
$result = $query->num_rows;

if ($result !== 0 ){
    echo '<li id="hit">There are $result results!</li>';

    while ($row = $query->fetch_assoc() ) {

    echo '<li>', 
    $row["a"], 
    ' ', 
    $row["b"],  
    '</li>';
    }
} else {
        echo '<li id="hit">no result!</li>';
    }

举一个输出的例子:

There are 3 results!
12345 New 
12345 New
56789 Chicago

那应该是这样的:

There are 3 results!
12345 New (2x)
56789 Chicago

所以表格是:

a     |    b
12345   New 
12345   New
56789   Chicago

非常感谢。

4

2 回答 2

1

我想到了这样的事情:

$query = $db->query("SELECT a, b, COUNT(*) counter FROM `table` WHERE ".$where." GROUP BY a, b");
$result = $query->num_rows;
if ($result !== 0 ){
  $resultSizeQuery = $db->query("SELECT COUNT(*) counter FROM `table` WHERE ".$where);
  $resultSize = $resultSizeQuery->fetch_assoc();
  echo '<li id="hit">There are '.$resultSize["counter"].' results!</li>';
  while ($row = $query->fetch_assoc() ) {
    echo '<li>'.$row["a"].' '.$row["b"];
    echo ($row["counter"] > 1 ? " (".$row["counter"]."x)" : "");
    echo '</li>';
  }
} else {
    echo '<li id="hit">no result!</li>';
}

将“$duplicates = ...”中的所有行替换到最后它应该可以工作。试一试,因为有时应该考虑问题之前的步骤。

问候

副歌

于 2013-04-16T11:36:53.620 回答
0

首先,您的语句将只返回 1 行与纽约,列计数器将有 2。芝加哥丢失,因为计数器只有 1。所以我认为您的结果看起来像:有 1 个结果!12345 纽约

如果您想获得“3 个结果”,只需执行 2 个查询,一个查询行数(只需省略 group 和 having 子句,也不要要求 a 和 b)。所以你得到输出:有 3 个结果!

接下来,您必须省略获取所有行(也包括没有重复行的行)的 having 子句。你可以这样写: echo ($row["a"].' '.$row["b"].($row["counter"] > 1 ? " (".$row["counter"]. “X)” : ””)

我希望这有帮助。

问候

帕拉斯库斯

于 2013-04-16T10:58:15.733 回答