我有一张桌子上有一些配料。示例:
id | title | ingredients
1 | ex1 | ketchup, chicken, salt, honey, mountain dew
2 | ex2 | beef, pepper, chili, honey, salt当用户搜索原料时,如:
ketchup, salt, honey我生成一个sql查询:
select * from recipes where(
(ingredients LIKE '%ketchup%')
AND (ingredients LIKE '%salt%')
AND (ingredients LIKE '%honey%')它会返回所有含有这些特定成分的食谱,而且它的工作原理是灰色的。
现在。我增加了一个范围滑块,以选择多少输入的成分,应该匹配的搜索返回任何东西。假设我选择了至少两个成分应该匹配,我想要创建一个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;发布于 2014-04-14 13:54:30
代替AND和OR条件计算met标准。本例提供了至少两种配料匹配的所有记录:
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;发布于 2014-04-14 14:07:03
我认为你应该做三张表,一张代表标题,另一张代表成分,另一张用来连接它们。
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在这种情况下,一个菜谱可以有许多成分,反之亦然,数据库将更加清晰,您将不必使用类似%。此外,你也不必每次都要写同样的配料来做食谱。
https://stackoverflow.com/questions/23061892
复制相似问题