2

「まずいリキュールを美味しいリキュールに変える」別名「ミックスカクテル」という新しい趣味を持っています。

私はオタクなので、本でレシピを調べたくないので、材料リストを読んで、足りないものがいくつかあることに気付きます. 代わりに、収集したすべてのレシピと材料を含むデータベースを作成し、コンピューターに、現在家にある材料で「作成」できるレシピを教えてもらいたい. この目的のために、私はこの2つのテーブルを持っています:

表 1: 多対多の関係に関する情報を保持します

recipe | ingredient
1      | 1          
1      | 2          
1      | 3          
2      | 1         
2      | 4          

表 2: この成分が入手可能かどうかの情報

ingredient | available
1          | true
2          | true
3          | true
4          | false

他のすべてのテーブルは、私の問題にとって興味深いものではありません。

これらの 2 つのテーブルは、次のような 1 つの大きなテーブルに簡単に変換できますINNER JOINingredient = ingredients.id

recipe | ingredient | available
1      | 1          | true
1      | 2          | true
1      | 3          | true
2      | 1          | true
2      | 4          | false

これを見ると、レシピ 1 は混ぜることができますが、材料が 1 つ不足しているため、レシピ 2 を混ぜることができないことがわかります。

私が今やりたいことは、結果が次のようになる方法を見つけることです。

recipe | all_available
1      | true
2      | false

特定のレシピのすべての材料が利用可能かどうかを確認する方法をすでに見つけました。

SELECT RtI.recipe, BIT_AND(ingredients.available) AS all_available
FROM RtI
INNER JOIN ingredients ON (ingredients.id = RtI.ingredient)
WHERE RtI.recipe = 1

結果:

recipe | all_available
1      | true

しかし、特定の ID を検索する必要があります。私が欲しいのは、「このレシピですべての材料が利用可能かどうかを表示する」ではなく、「すべての材料が利用可能なすべてのレシピを表示する」ことです。

MySQLクエリを使用するだけでこれを達成する方法はありますか?

4

4 に答える 4

1

条件を削除しWHERE、代わりに使用しますGROUP BY RtI.recipe

于 2013-09-04T17:00:02.220 に答える
1

試す

SELECT recipe, MIN(COALESCE(ingredients.available,0)) all_available
FROM rti LEFT JOIN ingredients ON ingredients.id=rti.ingredient
GROUP BY recipe

all_available材料が0不足しているレシピと1「完全な」レシピ用になります。

編集 念のため、成分表にも成分が記載されていませんCOALESCE. RtIテーブルはおそらく機械で生成され、有効な s のみを含むため、おそらく必要ありませんid...

于 2013-09-04T17:03:43.020 に答える
0

大きな助けをありがとう!

あなたのヒントに基づいて、私は自分の質問に答え、最終的な解決策をあなたと共有することができます:

SELECT RtI.recipe, recipes.title, ( SUM(ingredients.available) / COUNT(ingredients.available) ) AS available
FROM RtI
LEFT JOIN ingredients ON (ingredients.id = RtI.ingredient)
LEFT JOIN recipes ON (recipes.id = RtI.recipe)
GROUP BY RtI.recipe
ORDER BY ( SUM(ingredients.available) / COUNT(ingredients.available) ) DESC, recipes.title

これにより、次のようなテーブルが得られます。

recipe | title       | available
1      | Pina Colada | 1.00
2      | Caipirinha  | 0.50

すべてのブラケットと関数を使用して記述すると、もう少し長くなりますが、これが「ビュー」の目的だと思います。

于 2013-09-04T17:57:22.197 に答える