0

我正在尝试制作一个 mysql 视图,然后用于 Sphinx 搜索。

我有三张表:食谱、标签、配料。

*粗体字是行名

食谱是我存储食谱名称和烹饪时间(持续时间总计)的地方

配料是我存储特定食谱所需的 1 种配料的地方(这意味着每个食谱对应的配料不止一种。)配料有一个对应于食谱的recipe_id和我存储配料名称的配料字段。

标签类似于成分,因为对于每个食谱,可以有多个标签。例如:妈妈的鸡肉食谱有标签(逗号分隔):yummy,chicken,thanksgiving标签也有一个recipe_id字段和一个标签字段,我存储标签的名称。

现在,我正在实现 Sphinx 搜索,需要一种方法来组合

  • 配方 ID ( recipes.id )
  • 配方名称(recipes.name
  • 成分 ID ( ingredients.id )
  • 成分名称(成分.ingredient
  • 配料对应的配方 ID ( ingredients.recipe_id )
  • 标签 ID ( tags.id )
  • 标签名称 ( tags.tag )
  • 标签对应的配方 ID ( tags.recipe_id )

我的思考过程(我是一个漂亮的程序员,刚刚发现了 Sphinx)是创建一个 MYSQL 视图,它结合了上述所有行,所以我有一个看起来像这样的视图:

  1. 食谱名称:To' Good Chicken Soup......标签:美味......成分:鸡肉
  2. 食谱名称:To' Good Chicken Soup......标签:美味......成分:鸡肉
  3. 食谱名称:To' Good Chicken Soup......标签:Soup......成分:Chicken
  4. 食谱名称: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 回答