2013-04-16 139 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