1

FOOD と INGREDIENTS の 2 つのテーブルがあります。特定の食品を作るために必要なすべての食材を選択したい。

私はこのようなことができると思いました:

select NAME from INGREDIENTS
 where ID in (select ING1_ID, ING2_ID, ING3_ID from FOOD where NAME = 'Meat soup')

「in」サブ選択クエリでコンマ区切りの ID の文字列を渡す必要があるため、これは明らかに機能しません。列の値のリストを文字列に変換することを検討していましたが、いくつかの解決策がありますが、これを複雑にしすぎて、データベース モデルが間違っているのではないかと考え始めました。

食品テーブル:

ID      | NAME          | ING1_ID  | ING2_ID  | ING3_ID
--------+---------------+----------+----------+--------
1       | Meat soup     | 1        | 2        | 3
2       | Pasta Bolo    | 3        | 4        | 5
3       | Chicken salad | 2        | 4        | 5

成分表:

ID      | NAME          
--------+-----------
1       | pasta     
2       | onion   
3       | oil 
4       | paprika 
5       | chicken 
6       | cucumber 
4

3 に答える 3

7

多くの料理には 3 つ以上の食材が使われており、検索するときは、特定の食材が 1 番か 2 番か 3 番かは気にしません。

したがって、より良いモデルは

FOOD
id | name
1  | meat soup


INGREDIENTS
id | name 
1  | meat  

FOOD_INGREDIENTS
food_id | ingredients_id
1       | 1

今あなたのクエリはただです

select i.name from ingredients i, food f, food_ingredients fi
where fi.food_id = f.id
and fi.ingredients_id = i.id
and f.name = "meat soup"

「food_ingredients」テーブルは、「結合テーブル」と呼ばれることがよくあります。結合テーブルのもう 1 つの優れた点は、特定の種類の食品に含まれる特定の材料 (量や調理方法など) に固有の情報を追加できることです。

于 2012-06-17T18:22:15.117 に答える
3

問題は、正規化されたデータ モデルがないことに起因しています。

次のように再設計する必要があります。

食品テーブル:

  • フードID
  • 名前

成分表:

  • イングID
  • 名前

FOOD2INGREDIENTS テーブル:

  • フードID
  • イングID
  • (ここに数量を追加することは非常に理にかなっています)

このような再設計が行われると、クエリを実行するだけで必要なものを取得できます。

SELECT i.ID, I.Name 
FROM Ingredients I 
 INNER JOIN Food2Ingredients F2I 
 ON I.IngID = F2I.IngID
WHERE
  F2I.FoodID = :foodid;
于 2012-06-17T18:27:29.777 に答える
2

すべてのレシピが非常に貧弱で、ちょうど 3 つの材料が必要である限り、次のように記述して元のクエリの問題を解決できます。

SELECT Name FROM Ingredients
 WHERE ID IN (SELECT ING1_ID FROM Food WHERE Name = 'Meat soup'
              UNION
              SELECT ING2_ID FROM Food WHERE Name = 'Meat soup'
              UNION
              SELECT ING3_ID FROM Food WHERE Name = 'Meat soup'
             )

しかし、JacobMKerbocatはデータベースの再設計に関して正しい考えを持っていると思います。データベースの設計に問題があったというあなたの感覚は称賛に値します。4 つ (またはそれ以上) の成分を含むレシピが必要な場合、現在の設計では大惨事に直面することに注意してください (たとえば、上記のような多方向の UNION 操作を含む既存の SQL をすべて編集する必要があるため)。しかし、再設計されたスキーマは気付かないでしょう。

于 2012-06-17T18:31:59.560 に答える