2013-04-16 143 views
0

我有一个问题,实现某些输出以回显来自Array的结果列表。 我想创建一个Live搜索引擎,通过使用AJAX在keyup函数的帮助下运行查询。Mysql结果限制输出

当表格中列出的每个匹配都会回显输出时,一切正常。 现在我想合并所有重复的条目。

的代码是这样的:

$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 

非常感谢。

+1

什么是'了''B','C'? – hsz

+0

你好,对不起。 a是zpicode,b是城市。我更新了代码。谢谢 – bonny

+0

什么是'$ where'? – Uby

回答

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 = ...”到最后它应该做它的工作我们试试看,因为有时应该考虑问题之前的步骤。

问候

parascus

+0

好吧,我不得不努力一下,但所有这一切都很好。非常感谢您的帮助。祝你今天愉快。 – bonny

+0

不客气,如果您对代码有疑问,只需发布​​即可。 – parascus

0

首先,你的语句将返回仅1行与纽约和列计数器将有2芝加哥缺少,因为计数器仅1 因此,我认为你的结果是这样的: 疗法是1分的结果! 12345纽约

如果你想有“3​​结果”jsut做2个查询,一个用于行数(只是省略了组和子句,也不要求a和b)。 所以你得到的输出: 有3个结果!

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

我希望这有助于

问候

Parascus

+0

你好,对不起,我没有发布实际的代码。结果将以正确的方式显示和计算。我将表格编辑为NEW而不是纽约。所以这不是问题。问题只是显示和限制重复的方式。 – bonny

+0

嗨保利,现在好了,我有点困惑。你有两个不同的结果($查询中的所有行和$ check中有重复的所有行),但是你没有使用具有重复项的行。我认为获得这两个结果并将它们结合起来会有点复杂(两个很多的相互取出的行)。通过使用“SELECT a,b,COUNT(*)counter FROM table”WHERE $ where GROUP BY a,b“您应该拥有单行所需的所有内容(行总数除外),并且可以使用last我在答复中给出的陈述。或者我错过了一个重要的观点?问候,parascus – parascus

+0

你好,并感谢您的回答。你的权利。此时不使用$ duplicate。我不能触摸第一个查询,因为它仍在工作,并计算所有结果。所以最好添加一个查找重复项的查询。我已经尝试使用foreach循环来处理这个,但我仍然坚持。主要目标应该是这样的:if $ result!== 0然后看看是否有重复的foreach结果。如果有重复,则只列出结果一次,并在后面添加重复项的数量,如果没有重复列表结果一次。 – bonny