2017-07-25 67 views
1

我的表格有一行存儲爲D1234 HEX SCREW GS0090 O109。目前我可以做這樣的事情,如D1234 HEXSCREW GS0090,它會返回該行。不過,我希望能夠以任何組合或任何順序輸入文字,如D1234 GS0090HEX D1234,並讓它返回此行。如何才能做到這一點?按任意順序或組合使用單詞進行搜索並返回行

編輯:我使用Laravel 5.4,它使用MyISAM引擎

$products = DB::connection('it') 
      ->table('it') 
      ->join('units','units.code', '=', 's.code') 
      ->join('vendors', 'vendors.code', '=', 's.code') 
      ->where('s.deleted', '=', 0) 
      ->where('vendors.deleted', '=', 0) 
      ->where('s.description', 'LIKE', '%'.$term.'%') 
      ->orWhere('s.vendorcode', 'LIKE', '%'.$term.'%') 
      ->orWhere('s.vendordefaultcode','LIKE', '%'.$term.'%') 
      ->orWhere('vendors.partnumber', 'LIKE', '%'.$term.'%') 
      ->orWhere('vendors.partvendorcode', 'LIKE', '%'.$term.'%') 
      ->get()); 

回答

0

我建議使用全文搜索,如果你正在使用MySQL MySQL數據庫。它主要用於高級搜索,但它很好地提高了您的搜索。

首先你需要一個fulltext索引添加到表中要使用全文搜索的每一列:

ALTER TABLE tablename ADD FULLTEXT(description); 

下一頁修改查詢:

$products = DB::connection('it') 
      ->table('it') 
      ->join('units','units.code', '=', 's.code') 
      ->join('vendors', 'vendors.code', '=', 's.code') 
      ->where('s.deleted', '=', 0) 
      ->where('vendors.deleted', '=', 0) 
      ->whereRaw("MATCH (s.description) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (s.vendorcode) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (s.vendordefaultcode) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (vendors.partnumber) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (vendors.partvendorcode) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->get()); 

一些鏈接,以幫助out

MySQL Full-Text Search with Multiple words

mySQL Full Text Search With Percentage Scoring

+0

唯一的問題是,如果我輸入'D1234 HEX'它將返回所有包含'D1234'和'HEX'的行我只想要包含'D1234 HEX'的行返回 – derrickrozay

+0

實際上我認爲它返回所有行第一個詞,即'D1234' – derrickrozay

相關問題