2011-02-24 134 views
3

我有正在通過以下方式MySQL的PHP​​匹配多個關鍵字

Table: Images 
image_id 
image_title 
... 

Table: Keywords 
keyword_id 
keyword 

Table: Image_Keyword 
image_id 
keyword_id 

採用這種結構構成三個表,我能夠搜索如有圖片使用任何關鍵字匹配聯接和或聲明 - 然而,我希望能夠檢索具有多個關鍵字匹配的圖像,例如「關鍵字=('紅色'或'禮服')和'晚上'」 - 這會在夜晚返回所有圖片中的「紅色」或「連衣裙」。

理想情況下,我想允許用戶能夠在搜索框中指定AND和OR命令,這就是爲什麼我迄今選擇不爲每個新關鍵字單獨加入 - 但是我不確定如何繼續查詢的結構化。

目前,我有以下,沒有「和」執行:

SELECT i.* FROM images i 
JOIN image_keyword ik ON i.id = ik.image_id 
JOIN keywords k ON k.id = ik.keyword_id 
WHERE k.keyword IN ('night','red') 

如何去創造任何幫助的「和」此查詢的一部分,將不勝感激!謝謝好心,

// UPDATE

所以它看起來好像我將不得不通過創建做連接的每個「與」要求,我需要理清 - 但是我對現在的要求延長...

我有遵循以下結構

Table ImageData 
id 
image_id 
caption_id 
... 

Table Caption 
id 
data (text) 

在這種情況下其他兩個表,我要搜索對於關鍵字('red','dress'和'night'),使用與之前相同的'AND'和'OR'功能,但是如果文字數據與標題數據匹配(使用相同的規則)領域。我假設我可能在'關鍵字'搜索後使用OR,然後在標題上使用全文搜索,但是我不知道是否有更簡潔的方式來組合兩者,甚至可能是兩個單獨的查詢,然後選擇不同的結果 - 這可能允許AND在關鍵字中成功的情況,並且OR在標題中成功。

任何想法,將是非常美妙的

再次感謝

回答

1

我想你會落得什麼這是 -

  1. 一個INNER JOIN適用於所有的ORs。
  2. 一個INNER JOIN每個都適合你。

例如 -

SELECT i.* FROM images i 
INNER JOIN image_keyword ik ON i.id = ik.image_id 
INNER JOIN keywords kOR ON kOR.id = ik.keyword_id AND (kOR.keyword IN ('dress', 'red')) 
INNER JOIN keywords kAND1 ON kAND1.id = ik.keyword_id AND kAND1.keyword = 'night' 

PHP腳本會看起來像。

$orKeywords = arrya('dress', 'red', 'white'); 
$andKeywords = array('night', 'day'); 
$orJoin = ''; 
$andJoin = ''; 
if(count($orKeywords) > 0) 
{ 
    $orCondition = "'".implode("', '", $orKeywords)."'"; 
    $orJoin = " INNER JOIN keywords kOR ON kOR.id = ik.keyword_id AND kOR.keyword IN ($orCondition) "; 
} 
if(count($andKeywords) > 0) 
{ 
    $cnt = 1; 
    foreach($andKeywords as $keyword) 
    { 
     $andJoin .= " INNER JOIN keywords kAND{$cnt} ON kAND{$cnt}.id = ik.keyword_id AND kAND{$cnt}.keyword = '$keyword' ";$cnt++; 
    } 
} 
$sql = "SELECT i.* FROM images i 
INNER JOIN image_keyword ik ON i.id = ik.image_id 
$orJoin 
$andJoin"; 

你明白了..

+0

嘿 - 是的,謝謝你,我想我可能不得不爲每個創建一個新的聯接,雖然真的希望不必這樣!我會嘗試一下,並讓你知道 - 謝謝你:) – Dan 2011-02-24 17:47:57

+0

我有問題一起使用此附加額外的搜索作爲添加到上面的問題 - 有什麼你可能會建議? – Dan 2011-02-28 12:19:41

0

我只想生成凡在PHP腳本查詢的一部分,就像這樣:

<?php 
$entered_keywords = array('night','red'); 
$logic = 'OR'; // or 'AND' 
$sql_where = implode(' '.$logic.' ', "k.keyword='$entered_keywords'"); //don't forget the escaping here! 
$sql = 'SELECT i.* FROM images i 
JOIN image_keyword ik ON i.id = ik.image_id 
JOIN keywords k ON k.id = ik.keyword_id 
WHERE '.$sql_where; 
?> 
+0

我會在PHP中生成它,但如果我有三個關鍵詞,比如說「紅色」,「着裝」和「夜」,它會更成問題 - 如果我想查找包含這些確切關鍵字的圖片, 'AND'不會在當前設置中執行。如下面的查詢: SELECT i。* FROM images i JOIN image_keyword ik ON i.id = ik.image_id JOIN關鍵字k ON k.id = ik.keyword_id WHERE k.keyword ='night'和k.keyword ='red' – Dan 2011-02-24 16:53:01

+0

WHERE k.keyword ='night'and k.keyword ='red'and k.keyword ='dress'? – 2011-02-25 08:28:19

相關問題