2012-04-27 45 views
1

我們知道,MySQL可以通過LIKE和LIMIT得到結果,但我的問題是我們如何在DB中搜索一個字符串的單詞,顯示結果沒有重複?mysql查詢結果爲字符串單詞一個接一個LIKE和LIMIT

我的方法是,例如,當用戶做搜索「一書,爲PHP和MySQL」我們在發送查詢循環,到詞到DB:

SELECT * FROM table WHERE title LIKE %i% LIMIT 5 

但是這個代碼只顯示重複的結果,實際上每個單詞顯示5個結果,然後換一個單詞另一個單詞5個結果,...我需要逐個搜索db單詞,但最後只顯示5個匹配結果,沒有重複!對不起,我的英文不好:)

+0

您能否給一些數據的一個例子,您預期的結果集,用於查詢數據? – 2012-04-27 18:51:29

+0

請通過一個例子來解釋你的問題。 – Nishant 2012-04-27 18:52:52

+1

您可以在每個查詢之間使用UNION。這將刪除重複項。 – 2012-04-27 18:52:53

回答

2

我一直在閱讀註釋和你的問題,我認爲你需要一點PHP來準備你的MySql語句,以及一個Mysql查詢來獲取匹配結果限於前5個沒有重複的項目?

如果是這樣!

PHP

<?php 
    $searchFieldData = $_POST['search']; 
    $searchArr = explode(" ", $searchFieldData); 

    $sqlWhere = ''; 
    $count = count($searchArr); 
    foreach ($searchArr as $or) { 
    $sqlWhere.= " title LIKE '%".$or."%' "; 
    if ($count>1) $sqlWhere.= " OR "; 
    $count--; 
    } 

    $query = "SELECT col1, col2, ... FROM table WHERE ".$sqlWhere." LIMIT 5"; 
?> 

上面的代碼將返回該檢索詞: 「超級超級查詢履帶」

SELECT COL1,COL2,...... FROM表WHERE標題LIKE'%super%'或標題LIKE'%hyper%'或標題LIKE'%query%'或標題LIKE'%crawler%'LIMIT 5


現在的MYSQL MAGIC

如果你不希望任何重複的結果,只需使用:GROUP BY '標題'

和最終的查詢是:

$query = "SELECT col1, col2, ... FROM table WHERE ".$sqlWhere." GROUP BY 'title' LIMIT 5"; 
+0

@Mark Byers,馬克·拜爾斯,花了我一段時間來測試這個,發佈後有你的答案......你可能認爲這是一個改進,而不是重複:) – Zuul 2012-04-27 19:39:32

+0

不錯的代碼!我認爲這是最好的主意!謝謝各位朋友。 – Vahid 2012-04-28 07:18:53

1

我想你想是這樣的:

SELECT col1, col2, ... 
FROM table 
WHERE title LIKE '%a%' OR title LIKE '%b%' OR title LIKE '%c%' 
LIMIT 5 

注:

  • 使用LIKE '%xxx%'是大數據集的緩慢。考慮使用索引全文搜索。
  • 搜索「a」或「the」這樣的單詞可能會導致大量無用的匹配。考慮使用停用詞表或其他方法來改善匹配的相關性。
+0

我知道這個!但如果單詞超過3或更少,我該怎麼辦?所以你可以看到它不是一個動態的方式! – Vahid 2012-04-27 19:05:12

+0

@vahid:您可以動態構建查詢。 – 2012-04-27 19:35:50

+0

你是對的!我現在通過「Zuul」的幫助。 – Vahid 2012-04-28 07:24:25

1

你想只通過MySQL來實現這個嗎?我展示一個用PHP

$result = array(); 
$excludeIds = array(); //store recored id already got 
$words = explode(" ", $_POST['input']); 
foreach($words as $word) { 

    //if there is no 'id' column, use another one instead 
    $condForNoDup = ($excludeIds) ? 
    "AND id NOT IN (".implode(',', $excludeIds).")" : ""; 

    $word = '%'.mysql_real_escape_string($word).'%'; 
    $sql = "SELECT * FROM table 
      WHERE title LIKE '{$word}' {$condForNoDup} 
      LIMIT 5"; 

    //executeQuery() returns array which has 'id' as key 
    if($_result = executeQuery($sql)) { 
    $excludeIds = array_merge($excludeIds, array_keys($result)); 
    $result = array_merge($result, $_result); 
    } 
} 
print_r($result); 

尷尬......我也想知道,只有與MySQL聰明的答案:)

相關問題