2012-03-28 101 views
0

我正在開發一個烹飪食譜網站,並且我想根據使用的配置文件創建一個配方查找器。基於配料的基於PHP和MySQL的食譜查找器

我目前的發現者只能使用3種原料。

取景器應該返回基於使用incredients權(多個)製作

我的表(須與1-N *工作):

CREATE TABLE IF NOT EXISTS `INGREDIENTS` (
    `ingredients_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`ingredients_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ; 

CREATE TABLE IF NOT EXISTS `INGREDIENTS_POS` (
    `ingredients_pos_id` int(11) NOT NULL AUTO_INCREMENT, 
    `ingredients_id` int(11) NOT NULL, 
    `ingredients_unit` varchar(20) NOT NULL, 
    PRIMARY KEY (`ingredients_pos_id`), 
    KEY `ingredients_detail_fk` (`ingredients_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ; 

CREATE TABLE IF NOT EXISTS `RECIPES` (
    `recipes_id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(50) COLLATE utf8_bin NOT NULL, 
    `text` varchar(2000) COLLATE utf8_bin NOT NULL, 
    `count_persons` int(11) NOT NULL, 
    `duration` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `date` datetime NOT NULL, 
    `accepted` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`recipes_id`), 
    KEY `recipes_user_fk` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=88 ; 

CREATE TABLE IF NOT EXISTS `RECIPES_POS` (
    `recipes_pos_id` int(11) NOT NULL AUTO_INCREMENT, 
    `recipes_id` int(11) NOT NULL, 
    `ingredients_id` int(11) NOT NULL, 
    `ingredients_value` int(11) NOT NULL, 
    PRIMARY KEY (`recipes_pos_id`), 
    KEY `recipe_pos_rec_id` (`recipes_id`), 
    KEY `recipes_pos_ingredient_fk` (`ingredients_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=58 ; 

我的車解決方案(不支持從1 - n計數):

<?php 
include 'db_connect.php'; 

$q = urldecode(mysql_real_escape_string($_GET['q'])); 
$parameter = explode ('$',$q); 
$var = 0; 
//print_r($parameter); 

foreach($parameter as $ing) 
{ 
    //echo $ing; 
    $sql = "SELECT ingredients_id FROM INGREDIENTS WHERE name='".$ing."'"; 
    $result = mysql_query($sql,$db) or exit('{"Data":null,"Message":null,"Code":500}'); 
    $row = mysql_fetch_array($result); 
    $arr_id[$var] = $row['ingredients_id']; 
    $var++; 

} 
//print_r($arr_id); 

$sql = "SELECT r.recipes_id FROM RECIPES r, RECIPES_POS rp WHERE r.recipes_id = rp.recipes_id "; 

foreach($arr_id as $id) 
{ 
$sql .= "AND rp.ingredients_id =".$id . " "; 
} 
//echo $sql; 
$result = mysql_query($sql,$db) or exit('{"Data":null,"Message":null,"Code":500}'); 
mysql_close($db); 
$rec; 
while($row = mysql_fetch_array($result)) 
      { 
       //echo "test"; 
       $_GET['id'] = $row['recipes_id']; 
       $rec= include('get_recipe_byID.php'); 

      } 

//print_r(mysql_fetch_array($result)); 
if (count($arr_id) == 0) 
    { 
     echo '{"Data":null,"Message":null,"Code":404}'; 
     die(); 
    } 

?> 

我需要一個更好的解決方案,爲追逐。 也許SQL本身會幫我找到合適的食譜

THX

+0

請定義「好」 - 如果你問一個問題,你可能會得到一些幫助這裏的答案。 – 2012-03-28 10:10:12

+0

現在好嗎? – user547995 2012-03-28 12:20:47

+0

這是什麼''n''?這顆恆星是否在數學中使用? – 2012-03-28 12:25:46

回答

0

該查詢對我幫助很大:

select r.recipes_id 
    from RECIPES r 
    inner join RECIPES_POS rp on r.recipes_id = rp.recipes_id 
    where rp.ingredients_id in (4, 6) 
    group by r.recipes_id 
    having count(distinct rp.ingredients_id) = 2