0

我的数据库中有一个字段是一个数组,即:id_ingredients = "1,8,3,9,5,2,7,4"

如果字段 id 中存在任何变量 id,我想比较一个也是数组的变量以给出结果。

我正在尝试检查产品的成分是否包含变量中的任何成分。例如,如果有人对坚果过敏,我想出售所有含有任何坚果的产品。因此,我查询我的成分以获取名称中包含“坚果”一词的任何成分的 ID。然后我需要获取具有任何成分 ID 的产品。

这就是我所拥有的...

$alg = $_POST['alg'];

mysql_select_db($database, $Products);
$query_availIngredients = "SELECT * FROM ingredients WHERE ingredient LIKE '%$alg%' ";
$availIngredients = mysql_query($query_availIngredients, $Products) or die(mysql_error());
$row_availIngredients = mysql_fetch_assoc($availIngredients);

$ingarray = array(); 

    do{
         $ingarray[] = $row_availIngredients['id'];

    } while ($row_availIngredients = mysql_fetch_assoc($availIngredients));

$alg = implode (',', $ingarray);


mysql_select_db($database, $Products);
$query_Products = "SELECT *FROM products  WHERE 
 id_ingredients LIKE '%$alg%' " ;
$Products = mysql_query($query_Products, $Products) or die(mysql_error());
$row_Products = mysql_fetch_assoc($Products);

预先感谢您的帮助。

4

1 回答 1

0

将一组 ID 放置在单个数据库字段中并不是一个好主意,并且通过这种方式设计数据库,您会失去一些关系数据库为您提供的功能。

我不会在您的产品表中存储一组成分 ID,而是创建第三个表。

示例表模式如下所示:

产品
  ID
  产品名称
  产品描述
原料
  ID
  成分名称
产品成分
  ID
  id_产品
  id_Ingredients

一些示例数据可能如下所示:

产品
id 产品名称 产品描述
1 花生酱和果冻三明治 有史以来最好的三明治
成分
id 成分名称
1个花生酱
2 果冻
3 特制酱料
4 面包
ProductIngredients
 id id_Products id_Ingredients
1 1 1
2 1 2
3 1 4

然后,您可以获得包含“坚果”一词的成分 ID 列表,如下所示:

SELECT id FROM Ingredients WHERE ingredientName LIKE '%nut%'

以及含有含有“坚果”一词的成分的产品列表,如下所示:

SELECT
  Products.productName
FROM
  Products
  LEFT JOIN ProductIngredients ON ProductIngredients.id_Products = Products.id
  LEFT JOIN Ingredients ON Ingredients.id = ProductIngredients.id_Ingredients
WHERE
  Ingredients.ingredientName LIKE '%nut%'

您可以获得这样的产品的成分列表:

SELECT
  Ingredients.ingredientName
FROM
  Ingredients
  LEFT JOIN ProductIngredients ON ProductIngredients.id_Ingredients = Ingredients.id
WHERE
  ProductIngredients.id_Products = 1

这将为您提供如下列表:

  • 花生酱
  • 果冻
  • 面包

编辑

这称为多对多关系。

于 2013-10-05T03:02:11.927 回答