2014-04-14 32 views
0

我有一張表,其中包含一些成分。例如:在sql表中搜索多個值,範圍爲

id | title | ingredients 
1 | ex1 | ketchup, chicken, salt, honey, mountain dew 
2 | ex2 | beef, pepper, chili, honey, salt 

並且當像的成分用戶searchs:

ketchup, salt, honey 

我生成SQL查詢:

select * from recipes where( 
(ingredients LIKE '%ketchup%') 
AND (ingredients LIKE '%salt%') 
AND (ingredients LIKE '%honey%') 

並返回包含這些特定的成分的所有的食譜,它運作灰色。

現在。我添加了一個範圍滑塊,用於選擇應該匹配的搜索結果中返回的任何內容的數量。比方說,我選擇了2個成分應該至少匹配,我想做一個PHP函數,輸出一個SQL字符串,將輸入的所有成分配對,但我根本沒有它的心態。 實施例:

(ingredients LIKE '%ketchup%') AND (ingredients LIKE '%salt%') 
    OR 
    (ingredients LIKE '%ketchup%') AND (ingredients LIKE '%honey%') 
    OR 
    So on. So ketchup & salt pair, ketchup & honey pair, salt & honey pair. 

當然可變所以世界上沒有限制的成分輸入。我已經嘗試了幾個小時,但沒有成功。希望我已經解釋清楚我的自我&會有人能夠幫助或教我的東西:-)

我的PHP函數,它當前字符串看起來是這樣的:

$c_soeg = "ketchup, whatever, whatever. etc"; 
$c_ing_arr = explode(",", $c_soeg); 
$c_count_arr = count($c_ing_arr); 
$i = 0; 
$c_sql = "SELECT * FROM recipes WHERE ("; 
while($i < $c_count_arr){ 
    $c_sql .= "(ingredients LIKE '%".trim($c_ing_arr[$i])."%')"; 
    if($i != $c_count_arr-1){ 
     $c_sql .= " AND "; 
    } 
    $i++; 
} 
$c_sql .= ")"; 

而且包含變量該範圍的值被命名爲

$c_range; 
+1

當逗號分隔值出現時,停止在第3行閱讀。不要這樣做。閱讀有關規範化。 – fancyPants

+1

數據庫標準化,你會說嗎? – mituw16

+0

這只是一個例子,我知道正常化但不解決問題 – Imbue

回答

2

而不是AND和OR條件計數符合標準。這個例子給你,其中至少兩個成分匹配的所有記錄:

select * from recipes 
where 
    case when ingredients like '%ketchup%' then 1 else 0 end 
    + 
    case when ingredients like '%salt%' then 1 else 0 end 
    + 
    case when ingredients like '%honey%' then 1 else 0 end 
    > = 2; 
+0

工程就像一個魅力,謝謝! – Imbue

2

我想你應該做3個表意 一個爲標題,另一個用於配料和一個連接它們

recipy 
    id | title | 
    1 | ex1 | 
    3 | ex2 | 

    recipyingredients 
    recipyid | ingredientsid 
      1 | 1 
      1 | 2 
      1 | 3 
      1 | 4 
      1 | 5 
      2 | 1 
      2 | 6 
      2 | 7   

    ingredients 
    id | ingredients 
    1 | ketchup 
    2 | chicken 
    3 | salt 
    4 | honey 
    5 | mountain dew 
    6 | beef 
    7 | pepper 

在這種情況下,一個收件人可以有很多成分,反之亦然 數據庫會更清晰,你不必像%那樣使用。 此外,您不必每次都寫入相同的成分

+0

您也可以在收件人表 – MenzZana

+0

中添加成分的數量感謝您的回覆。問題在於它的用戶寫的成分,如「200香蕉,5瓶番茄醬」,等等。只是認爲把所有這些分成不同的表格會非常複雜。人們也有不同的投入方式。 – Imbue

+0

@ user2979822它可能會有點複雜,但絕對是正確的做事方式。請記住,正確的方式總是需要更多的工作,但最終會帶來回報。您需要驗證用戶輸入並決定允許/禁止他們輸入。您現在面臨的問題是不採取控制的直接結果。您需要掌握並控制您的應用和體系結構。 –