2015-12-19 134 views
0

我已經使用具有LIKE子句的Query在兩側都使用%通配符實現了搜索。SQL使用LIKE搜索查詢

我國傢俱有列名。如果我用P或PAK搜索它會顯示結果但是如果我用'我住在巴基斯坦'搜索它,它不會比較。

我明白的事情是它與子字符串相匹配。

是否有可能使其反之亦然像我傳遞字符串「我住在巴基斯坦,並與字符相匹配的字段,並得到巴基斯坦的結果。

即時幫助將不勝感激。

+3

示例數據,所需結果和您嘗試的查詢將闡明您正在嘗試執行的操作。 –

+0

我使用SELECT * FROM表WHERE country like'%Pak%' 它給了我正確的結果,並顯示所有行有國家巴基斯坦 但我希望它搜索,而我與'我愛巴基斯坦'相比,因爲這句子還包含巴基斯坦 –

回答

0

,你可以使用來自笨框架等等()函數。

$this->db->like(); 

該函數使您能夠生成LIKE子句,這對於執行搜索很有用。

注:傳遞給這個函數的所有值都會自動轉義。

簡單的鍵/值方法: $ this-> db-> like('title','match');

// Produces: WHERE title LIKE '%match%' 

如果使用多個函數調用,他們將與它們之間被鏈接:

$this->db->like('title', 'match'); 
    $this->db->like('body', 'match'); 

    // WHERE title LIKE '%match%' AND body LIKE '%match% 

如果你想控制,其中通配符(%)放置,你可以使用可選的第三論據。您的選項是「之前」,「之後」和「兩者」(這是默認設置)。

$this->db->like('title', 'match', 'before'); 
    // Produces: WHERE title LIKE '%match' 

    $this->db->like('title', 'match', 'after'); 
    // Produces: WHERE title LIKE 'match%' 

    $this->db->like('title', 'match', 'both'); 
    // Produces: WHERE title LIKE '%match%' 

如果你不想使用通配符(%),你可以傳遞給可選的第三個參數'none'。

$this->db->like('title', 'match', 'none'); 
    // Produces: WHERE title LIKE 'match' 

See This

我認爲你需要做的是搜索和比較在提供的文本的每一句話,我認爲這將是有益的。

$temp = array(); 
$str = array(); 
$str = explode(' ', $string); 
foreach ($str as $word) { 
    if (strlen($word) > 2) { 
     $this->db->or_like('country_name', $word, 'both'); 
    } else { 
     continue; 
    } 
} 
$countries = $this->db->get('countries'); 

我想在$國家,你將擁有所有需要的結果。

0

你可以用逗號代替空格,然後用find_in_set。假設你的字符串是$str,考慮這個查詢:

SELECT * 
FROM countries c 
WHERE c.name LIKE '%$str%' OR 
     FIND_IN_SET(c.name, REPLACE($str, ' ', ',')) > 0 
+0

感謝您指出一個更多的功能。 :)問題:是否有方法來標記/避免在集合中使用1和2個字母的單詞? – Tpojka

+0

@Tpojka不太清楚你的意思。你能否詳細說明一下? – Mureinik

+0

如果您檢查我提供的PHP解決方案,可以看到避免短的單詞。例如''value =「我的代碼'a'中的一個國家塞爾維亞''將會被避免,因爲它可以在許多不想要的結果中找到。當然,對於國家表來說,因爲它的內容是〜200個結果,所以並不是很需要,但是要求通用的mysql方式解決方案。 – Tpojka

0

試試這個

public function searchCountry($value) 
{ 
    $value = $value; 
    $query = $this->db->query("SELECT * FROM table_name WHERE country LIKE '%$value%' "); 
    $result = $query->result_array(); 
    return $result; 
} 
+0

@MudassirShah如果我的答案有幫助接受它 –

0

這可能是工作(免責聲明:未測試):

public function searchCountry($value) 
{ 
    $sql = "SELECT DISTINCT FROM `countries`"; 

    $value = explode(' ', $value);// use all words from query 
    $first_match = FALSE; 
    foreach ($value as $k => $v) 
    { 
     if (strlen($v) >= 3)// exclude 1 and 2 letter words if want 
     { 
      if (! $first_match) 
      { 
       $sql .= " WHERE `name` LIKE %$v%"; 
      } 
      else 
      { 
       $sql .= " OR `name` LIKE %$v%"; 
      } 
     } 
    } 

    $sql .= " LIMIT 50"; 

    $query = $this->db->query($sql); 
    $result = $query->result_array(); 
    return $result; 
} 

但你也許應該使用@Mureinik解。

0

您可以使用正則表達式技巧爲了這個目的:

where country regexp replace($str, ' ', '|') 

此構建表達:

where country regexp 'I|live|in|Pakistan' 

這是因爲對正則表達式規則的計算結果爲True。