使用范围在sql表中搜索多个值

时间:2014-04-14 13:49:29

标签: php mysql sql

我有一张包含一些成分的表格。例如:

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

当用户搜索以下成分时:

ketchup, salt, honey

我生成了一个sql-query:

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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

在这种情况下,一个收件人可以有很多成分,反之亦然 数据库会更清晰,你不必像%那样使用。 此外,您不必每次为收件人写相同的成分