0

mysqlビューを作成してSphinx検索で使用しようとしています。

レシピ、タグ、材料の3つのテーブルがあります。

*太字の単語は行名です

レシピは、レシピと調理時間(durationtotal)を保存する場所です。

材料は、特定のレシピに必要な1つの材料を保存する場所です(つまり、すべてのレシピに対応する複数の材料があります)。材料には、レシピに対応するrecipe_idと、材料の名前を保存する材料フィールドがあります。

タグは材料に似ており、レシピごとに複数のタグが存在する可能性があります。例:Mom's Chicken Recipeにはタグ(カンマで区切られています)があります:yummy、chicken、 thanksgivingタグには、recipe_idフィールドとタグの名前を格納するタグフィールドもあります。

今、私はSphinx Searchを実装していて、

  • レシピID(recipes.id
  • レシピ名(recipes.name
  • 材料ID( components.id )
  • 材料名( components.ingredient )
  • 対応するレシピID(components.recipe_id
  • タグID(tags.id
  • タグ名(tags.tag
  • 対応するレシピIDのタグ(tags.recipe_id

私の思考プロセス(私はかなりのプログラマーであり、Sphinxを発見したばかりです)は、上記のすべての行を組み合わせたMYSQLビューを作成することであるため、次のようなビューが得られます。

  1. RecipeName:To'Good Chicken Soup ......タグ:おいしい......材料:チキン
  2. RecipeName:To'Good Chicken Soup ...... Tag:Delicious ...... Ingredient:Chicken
  3. RecipeName:To'Good Chicken Soup ...... Tag:Soup ...... Ingredient:Chicken
  4. RecipeName:To'Good Chicken Soup ......タグ:おいしい......材料:水

このメソッドの問題は、ご覧のとおり、多くの行が重複していることです。しかし、これは私が考えることができる唯一の方法だったので、私は先に進んで、これを使って新しいビューを作成しました:

SELECT
   recipes.id,
   recipes.name,
   ingredients.ingredient,
   tags.tag
FROM
   recipes, ingredients, tags
WHERE
   recipes.id=ingredients.recipe_id 
AND recipes.id=tags.recipe_id;

このコードをmysqlに組み込んだのですが、それに対応するタグ/成分を持つレシピしか取得していませんか?また、これは私のmysqlビューを構造化するための正しい方法ですか?

助けてくれてありがとう!

4

2 に答える 2

1

使用したい材料やタグがあるかどうかに関係なく、すべてのレシピを取得したい場合LEFT OUTER JOIN

SELECT recipes.id, recipes.name, ingredients.ingredient, tags.tag
FROM recipes
 LEFT OUTER JOIN ingredients ON recipes.id=ingredients.recipe_id 
 LEFT OUTER JOIN tags ON recipes.id=tags.recipe_id;
于 2013-02-23T02:00:12.337 に答える
1

左結合を試してください: http ://www.w3schools.com/sql/sql_join_left.asp

SELECT
   recipes.id,
   recipes.name,
   ingredients.ingredient,
   tags.tag
FROM
   recipes
LEFT JOIN ingredients ON recipes.id=ingredients.recipe_id
LEFT JOIN tags ON recipes.id=tags.recipe_id
于 2013-02-23T02:03:28.683 に答える