2011-03-26 66 views
1

我在php/mysql中構建搜索功能,並且正在尋找正確的MySql函數。我的表看起來有點像這樣:選擇列文本包含數組值的行

id | text 
-------------------------------------- 
1  | I like pony's. 
2  | Do you like fish? 
3  | We like fishes! 

我想搜索的列「文本」的數組的確切值之一,例如:

$search_array = array('fish','dogs','cat','panda'); 

我要找的正確的MySql函數只返回第二行(使用當前數組)。該數組可以包含數百個值。

我有6000多行,每天增長+/- 400.我試過REGEXP,但是有一個大數組,它花了大約10秒鐘才返回相應的行。

請大家幫忙,我現在已經打了差不多3整天了......先謝謝了!

+0

這是什麼數據和這種搜索的目的是什麼?有可能是另一種方法來做到這一點 – 2011-03-26 13:14:02

+0

您可能會發現以下問題很有用:http://stackoverflow.com/questions/1568068/mysql-select-like-must-match-whole-words-only-to-the-variable – 2011-03-26 13:34:43

+0

好吧,文本列實際上包含推文。我想創建一些類別:每個類別將是一個關鍵字數組。如果推文包含其中一個關鍵字,則應該選擇它們。這是否清楚? – 2011-03-26 13:36:05

回答

1

如果搜索數組是恆定的,或者偶爾發生變化,我建議另外使用兩個表格'tags'和'tags-text'。

例如,在您的示例中,id爲2的行包含魚,因爲魚在我們的「標籤」表中,新記錄將被放置在「標籤 - 文本」表中。當您搜索數組時,您可以搜索數組中的某個組件是否位於'tags-text'表中,並加入'text'表並返回文本和ID並執行所需的任何操作。

其他表的結構:

'標籤' 表

id | tags 
-------------------------------------- 
1  | fish 
2  | dogs 
3  | cats

'標籤文本' 表

text-id | tags-id 
-------------------------------------- 
2  | 1

這是否有助於/有意義

+0

+1的,因爲它的措辭,而是常識 – 2011-03-26 13:18:43

+0

如果他的數據變成以逗號分隔的集合 – 2011-03-26 13:23:50

+0

這是真的,我不會感到驚訝,下面沒有這樣的問題:逗號分隔或分隔由| – 2011-03-26 13:38:47

-1

好吧,也許你應該嘗試將mysql和php混合一下。 這裏是僞代碼

 
select 100-1000 rows at one time from db 
    use strpos to check each element in your array against the text column 
     if element found 
      store it 
      if 2 elements found break the loop 
     else 
      continue 
+0

那會更慘性能明智 – 2011-03-26 13:19:29

+0

他只想要兩行,如果陣列是大循環將只在進程幾次 – danidacar 2011-03-26 13:22:32

+0

他只1實際。 – 2011-03-26 13:26:55

-1

像這樣的事情也許......

$search_term = implode(",",$search_array); 
SELECT * FROM your_table WHERE text IN ($search_term)";  
+0

如果你使用IN,那麼'文本'應該精確地匹配其中一個數組的值嗎? – 2011-03-26 13:39:58

+0

是的,我相信你是對的,這個怎麼樣。 'SELECT * FROM your_table其中文本REGEXP「魚|狗|貓」;'你需要相應地操作您的陣列,使其插入到SQL語句正確。 – luckytaxi 2011-03-26 13:43:41

+0

嗯,這是我第一次嘗試。不知怎的,那拿了秒搜索的正則表達式字符串變長.. – 2011-03-26 13:47:20

0

好吧,我想我已經找到了最簡單的方法:讓PHP創建MySQL查詢與和WHERE解決它喜歡。

$search_array = array('fish','dogs','cat','panda'); 

$string = ''; 

foreach($search_array as $term) { 
    $string = $string."text LIKE '%".$term."%' AND "; 
} 

foreach循環的結果是:

"text LIKE '%fish%' AND LIKE '%dogs%' AND LIKE '%cat%' AND LIKE '%panda%' AND " 

現在讓我們刪除該字符串的尾部和編寫查詢:

$string = substr($string, 0, -5); // removing " AND " at the end of the string 

$query = "SELECT * FROM table WHERE $string"; 
$results = mysql_query($query); 

感謝其他的答案呢:)