2015-09-25 125 views
1

我需要一些SELECT查詢的邏輯幫助,並希望有人能給我一個比我有更好的主意。MySql SELECT查詢跨多個字段的多個關鍵字

我有一個表是這樣的:

+---------+----------+---------+-----------+ 
|  id | model | variant | category | 
+---------+----------+---------+-----------+ 
|  1 | round | black | fruit  | 
|  2 | square | white | vegetable | 
|  3 | flat  | red  | meat  | 
|  4 | round | black | meat  | 
+---------+----------+---------+-----------+ 

用戶將被允許通過輸入一個或多個關鍵詞上做此表的搜索。

我現在的查詢對所有輸入的關鍵字AGAINST做了MATCH每個字段,並且我得到與任何關鍵字匹配的行。 因此,如果輸入的是「圓肉」,結果將是行1,3和4:

SELECT v.*, vt.color 
      FROM tbl_items 
      AS v 
      LEFT JOIN tbl_apple 
      AS vt 
      ON v.id = vt.v_id 
      WHERE ( 
      MATCH (v.model) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE) 
      OR MATCH (v.variant) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE) 
      OR MATCH (v.category) AGAINST ('keyword1 keyword2 ' IN BOOLEAN MODE)) 
      AND v.type = 4 

不過,我只需要返回包含所有關鍵字的行。關鍵字可能包含在三列中的任何一列中。

因此,如果用戶輸入「圓肉」,只返回第4行。

我現在的想法很簡單,可能不是很好(我希望多個關鍵字一些性能問題):

SELECT v.*, vt.color 
      FROM tbl_items 
      AS v 
      LEFT JOIN tbl_apple 
      AS vt 
      ON v.id = vt.v_id 
      WHERE 
       ( 
        (v.model = 'keyword1' 
        OR v.variant = 'keyword1' 
        OR v.category = 'keyword1' 
        ) 
     AND 
        (v.model = 'keyword2' 
        OR v.variant = 'keyword2' 
        OR v.category = 'keyword2' 
        ) 
       ) 
      AND v.type = 4 

有沒有更好的辦法做到這一點?

+1

像這樣複雜的關鍵字搜索的要求,我建議使用像一個專門的搜索工具獅身人面像或Lucene - 它會爲你的系統增加一點複雜性,但是在性能和​​靈活性方面的回報將是巨大的。 – Spudley

+0

Sphinx是一個很好的建議,謝謝。但是,我正在嘗試搜索功能整合只是整個搜索的一小部分(已經可用),所以我需要更簡單一些。否則,如果此類搜索是爲了實現核心功能,相當有效的建議。 – user3132858

回答

1

這是一個完整的代碼,可以幫助你。」 您可以根據數據庫或要求修改查詢。

<?php 
define('DB_SERVER', 'localhost'); 
define('DB_USERNAME', 'root'); 
define('DB_PASSWORD', ''); 
define('DB_DATABASE', 'test'); 
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); 

if(isset($_POST['submit'])) 
{ 
    $search_text = $_POST['text']; 

    $values = explode(" ",$search_text); 

    $query = ""; 
    foreach($values as $value) 
    { 
     $query .='concat(model,varient,category) like "%'.$value.'%" AND '; 
    } 

    $query .= "1=1"; 

    $query = "select * from tbl_items where ".$query.""; 
    $result= mysqli_query($db,$query); 
    echo '<table>'; 
    while($row=mysqli_fetch_array($result)) 
    { 
     echo '<tr>'; 
     echo '<td>'.$row['model'].'</td><td>'.$row['varient'].'</td><td>'.$row['category'].'</td>'; 
     echo '</tr>'; 
    } 
echo '</table>'; 
} 
?> 
<form method="post" name="form"> 
<input type="text" name="text" /> 
<input type="submit" value="submit" name="submit"> 
</form> 
+1

感謝隊友,我喜歡你發佈了一個完整的解決方案,而不僅僅是它的一部分:)我結束了我的想法與你的代碼的一部分,截至目前,它似乎工作相當不錯!再次感謝! – user3132858

+0

歡迎您... –