问题与Mysql View和/或不同的方法?

时间:2013-02-23 01:58:08

标签: mysql phpmyadmin sphinx

我正在尝试创建一个mysql视图,然后与Sphinx搜索一起使用。

我有三张桌子:食谱,标签,配料。

* 粗体字是行名

食谱是我存储食谱名称的地方,以及烹饪时间(持续时间总数

成分是我存储特定配方所需的1种成分的地方(这意味着每种食谱中都有超过1种成分。)成分含有 recipe_id ,与食谱相对应,成分字段,我存储成分的名称。

标签类似于成分,因为对于每个食谱,可以有超过1个标签。例如:妈妈的鸡肉食谱有标签(逗号描述):美味,鸡肉,感恩节标签还有一个 recipe_id 字段和一个标签字段,我存储标签的名称。

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

  • 食谱标识( recipes.id
  • 配方名称( recipes.name
  • 成分Id( ingredients.id
  • 成分名称( ingredients.ingredient
  • 配料相应食谱ID( ingredients.recipe_id
  • 标签ID( tags.id
  • 标签名称( tags.tag
  • 标记相应的食谱ID( tags.recipe_id

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

  
      
  1. 食谱名称:'好鸡汤......标签:美味......成分:鸡肉
  2.   
  3. 食谱名称:'好鸡汤......标签:美味......成分:鸡肉
  4.   
  5. 食谱名称:'好鸡汤......标签:汤......成分:鸡肉
  6.   
  7. 食谱名称:'好鸡汤......标签:美味......成分:水
  8.   

正如您所看到的,此方法的问题是它复制了很多行。但由于这只是我能想到的方法,我继续用这个创建了一个新视图:

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视图的正确方法吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

尝试LEFT JOIN: 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