我有一张包含一些成分的表格。例如:
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;
答案 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
在这种情况下,一个收件人可以有很多成分,反之亦然 数据库会更清晰,你不必像%那样使用。 此外,您不必每次为收件人写相同的成分