2012-07-02 48 views
1

列表當我運行我的代碼,我不能找回,我瞄準,因爲正在通過查詢運行關鍵字不一樣,在數據庫的關鍵字的條目。尋找逗號隔開的關鍵字

關鍵詞:

$keywords = 'spaghetti,macaroni,hamburger'; 

查詢:

mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%$keywords%' ORDER BY id DESC LIMIT 1"); 

我針對使用這些關鍵字的條目:

food, restaurant, hamburger, spaghetti, taco,pie 

我可能失去了一些東西簡單在這裏,因爲我一直連續工作12小時。但是,我已經嘗試過解決此問題的任何嘗試。

從我的觀點來看,查詢應該目標條目,因爲有2名匹配的關鍵字來返回。

我應該做什麼不同?

+5

這不是如何'LIKE'工作。您可能需要對數據進行規範化處理,以使關鍵字位於單獨的表格中,並通過其ID爲 –

+0

鏈接到餐廳(或任何主要記錄)。您不需要在問題標題中添加[[已解決]]。 *您已經做了相應的事情並檢查了刻度標記。 – mario

回答

2
$like = array(); 
$keywords = explode(',' , $keywords); 
foreach($keywords as $keyword) { 
    $like[] = "`keywords` LIKE '%$keyword%'"; 
} 
$like = implode(' OR ', $like); 
$query = "SELECT * FROM `table` WHERE $like ORDER BY id DESC LIMIT 1"; 
2

你需要打破的關鍵字,然後針對每一個

SELECT * FROM mytable 
WHERE keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%' 
-- ... 

單獨LIKE比較你可以做這樣的事情

<?php 

$keywords = 'spaghetti,macaroni,hamburger'; 

$query = "SELECT * FROM mytable WHERE 1=1"; 

$keywords = explode(',', $keywords); 

if (count($keywords)) { 
    $query .= sprintf(
     " AND (%s)", 
     implode(' OR ', array_map(function($word){ 
      return "keywords LIKE '%{$word}%'"; 
     }, $keywords)) 
    ); 
} 

echo $query; 

// SELECT * FROM mytable WHERE 1=1 AND (keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%' OR keywords LIKE '%hamburger%') 

正如您從註釋中看到,有更好的方法來處理這個問題,但我假設這個基本問題正在尋找一個簡單的答案。

我沒有做任何輸入清理,或者添加其他任何失敗保險箱。像這樣構建查詢不是很可靠,您應該繼續學習PHP/MySQL,以避免將來出現常見的陷阱。不過,我相信目前有更多先進的方法有點不足。如果有人想提供更好的技術,他們認爲OP可以把握,通過各種手段,去了:)

+0

或'和',在這個問題的意圖還不清楚... – Ben

+2

注意查詢優化器不能優化'LIKE「%意大利麪條%」的關鍵字或關鍵字LIKE「%通心粉%」',這將成爲一個連續的掃描,不使用索引。歸一化可能是更好的解決方案,因爲索引可用於例如'關鍵字IN('通心粉','意大利麪條')' –

+2

@FrankFarmer - 這是OP描述的問題的一個方面。沒有答案永遠不會避免。 – MatBailie

1

試試這個,它可能比使用多個or條款

Select * from mytable 
where keywords REGEXP 'spaghetti|macaroni|hamburger' 
+1

我編輯了你的帖子;您正在使用第一個標記'[PHP]'爲Google Prettify標記,因此被抓出來。這可以通過HTML註釋來改變,對於SQL <! - language:lang-sql - >' – Ben

1

你更快必須使用LIKE與separeted的作品,你可以試試這個:

$keywords = 'spaghetti,macaroni,hamburger'; 

$arrayWords = explode(',', $keywords); 

$like = ''; 

foreach($arrayWords as $word) 
    $like .= empty($like) ? " keywords LIKE '%$word%' " : " OR keywords LIKE '%$word%' "; 

mysql_query("SELECT * FROM ---- WHERE $like ORDER BY id DESC LIMIT 1"); 
1
mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%". implode("%' OR keywords LIKE '%", explode(",", $keywords)) ."%' ORDER BY id DESC LIMIT 1");