首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用范围搜索sql表中的多个值

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

Stack Overflow用户
提问于 2014-04-14 13:49:28
回答 2查看 75关注 0票数 0

我有一张桌子上有一些配料。示例:

代码语言:javascript
复制
 id | title | ingredients 
 1  | ex1   | ketchup, chicken, salt, honey, mountain dew
 2  | ex2   | beef, pepper, chili, honey, salt

当用户搜索原料时,如:

代码语言:javascript
复制
ketchup, salt, honey

我生成一个sql查询:

代码语言:javascript
复制
select * from recipes where( 
(ingredients LIKE '%ketchup%')
AND (ingredients LIKE '%salt%')
AND (ingredients LIKE '%honey%')

它会返回所有含有这些特定成分的食谱,而且它的工作原理是灰色的。

现在。我增加了一个范围滑块,以选择多少输入的成分,应该匹配的搜索返回任何东西。假设我选择了至少两个成分应该匹配,我想要创建一个PHP函数,该函数输出一个sql字符串,它对所有输入的成分都配对,但我根本没有这种心态。示例:

代码语言:javascript
复制
  (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函数如下所示:

代码语言:javascript
复制
$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 .= ")";

而包含范围值的变量名为

代码语言:javascript
复制
$c_range;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-14 13:54:30

代替AND和OR条件计算met标准。本例提供了至少两种配料匹配的所有记录:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2014-04-14 14:07:03

我认为你应该做三张表,一张代表标题,另一张代表成分,另一张用来连接它们。

代码语言:javascript
复制
    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

在这种情况下,一个菜谱可以有许多成分,反之亦然,数据库将更加清晰,您将不必使用类似%。此外,你也不必每次都要写同样的配料来做食谱。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23061892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档