2010-02-24 41 views
2

我在mySQL中連接以產生一個可以搜索的字段。這包含動物以及客戶數據庫的所有者名稱和地址。我需要能夠以任何順序按動物名稱,所有者姓名和郵編進行搜索。 因此,如果,如果我的名字是約翰·史密斯和我自己的叫做菲狗,住在郵政編碼AB1 2CD,我想搜索是產量的結果,如果任何被輸入以下內容:在連接字段中以任意順序過濾mySQL數據庫

「約翰菲AB1」 「約翰AB1" ‘AB1約翰’ ‘AB1汪汪’ ‘汪汪2CD’ ‘2CD’ ‘汪汪’ 等...即任何以任意順序的領域,也沒有完整的單詞或者這樣的「約翰·菲AB1「應該產生與」jo fi AB1「相同的結果

我目前擁有這個PHP代碼,在我的搜索頁面上取一個單獨的文本字段,然後爆炸然後破壞它以添加%betwe EN搜索術語:

$list = explode(' ',$_GET["q"]); 
$q = implode('%%', $list); 
if (!$q) return; 
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,owner.OwnerID 
FROM owner 
Inner Join patient ON owner.OwnerID = patient.OwnerID 
WHERE CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim, 
owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) LIKE '%$q%'"; 

這適用於「AB1約翰」和「約翰·菲多」,而不是「汪汪約翰」,因爲它是無序的級聯領域。

任何幫助,不勝感激

+3

多麼可怕的想法......這個前端+結束通配符謂詞以及CONCAT_WS系統地引起一個表掃描! – mjv

+2

+1爲娛樂價值 – Martin

回答

1

我認爲你將不得不分開的關鍵字,並添加查詢的關鍵字串中的每個關鍵字。

所以首先(在PHP中),分割查詢字符串並動態生成您的SQL查詢,然後將其發送到數據庫。下面是一些僞代碼向你展示我的意思:

$keywords = explode(' ', $q); 
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
    owner.OwnerSurnamePrim,owner.OwnerForenamesPrim, 
    owner.OwnerID 

    FROM owner 
    Inner Join patient ON owner.OwnerID = patient.OwnerID"; 

$first = true; 

foreach($keyword in $keywords): 
    if($first): 
     $sql += " WHERE "; 
     $first = false; 
    else: 
     $sql += " AND "; 

    $escaped = mysql_real_escape_string($keyword); 
    $sql += " CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim, 
     owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) 
     LIKE '%$escaped%'"; 

但一定要提防,這不會是附近任何地方快,你會在日常工作可能遇到表的大小。您可能希望查看進行全文搜索的更好方法,無論是使用庫還是製作由觸發器維護的關鍵字交叉引用表。

0

你可以試試這個http://www.sphinxsearch.com/

你需要專門的服務器來運行這個東西,但如果你有一個,獅身人面像將輕鬆解決你的問題,你的查詢將不會加載數據庫。