0

データベースに配列のフィールドがあります。つまり、id_ingredients = "1,8,3,9,5,2,7,4" です。

配列でもある変数を比較して、変数 ID のいずれかがフィールド ID に存在する場合に結果を取得したいと考えています。

製品の成分に変数の成分が含まれているかどうかを確認しようとしています。たとえば、誰かがナッツにアレルギーがある場合、あらゆる種類のナッツを含むすべての製品を選択したいと考えています. そのため、名前に「nut」という単語が含まれるすべての食材の 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 の配列を 1 つのデータベース フィールドに配置することは、実際には良い考えではありません。データベースをこのように設計すると、リレーショナル データベースが提供する機能の一部が失われます。

製品のテーブルに成分 ID の配列を格納するのではなく、3 つ目のテーブルを作成します。

テーブル スキーマの例は次のようになります。

製品
  ID
  商品名
  製品説明
材料
  ID
  成分名
製品成分
  ID
  id_製品
  id_成分

一部のサンプル データは次のようになります。

製品
ID productName productDescription
1 ピーナッツバターとゼリーのサンドイッチ 今までで最高のサンドイッチ
食材
ID
1 ピーナッツバター
2 ゼリー
3 特製ソース
4 パン
製品成分 ID id_製品id_Ingredients

1 1 1
2 1 2
3 1 4

次に、次のように「nut」という単語を含む食材の 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 に答える