我正在尝试创建一个mysql视图,然后与Sphinx搜索一起使用。
我有三张桌子:食谱,标签,配料。
* 粗体字是行名
食谱是我存储食谱名称的地方,以及烹饪时间(持续时间总数)
成分是我存储特定配方所需的1种成分的地方(这意味着每种食谱中都有超过1种成分。)成分含有 recipe_id ,与食谱相对应,成分字段,我存储成分的名称。
标签类似于成分,因为对于每个食谱,可以有超过1个标签。例如:妈妈的鸡肉食谱有标签(逗号描述):美味,鸡肉,感恩节标签还有一个 recipe_id 字段和一个标签字段,我存储标签的名称。
现在,我正在实施Sphinx搜索,需要一种方法来组合
我的思维过程(我是一个漂亮的程序员,刚刚发现Sphinx)是创建一个结合了上述所有行的MYSQL视图,所以我有一个看起来像这样的视图:
- 食谱名称:'好鸡汤......标签:美味......成分:鸡肉
- 食谱名称:'好鸡汤......标签:美味......成分:鸡肉
- 食谱名称:'好鸡汤......标签:汤......成分:鸡肉
- 食谱名称:'好鸡汤......标签:美味......成分:水
醇>
正如您所看到的,此方法的问题是它复制了很多行。但由于这只是我能想到的方法,我继续用这个创建了一个新视图:
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视图的正确方法吗?
感谢您的帮助!
答案 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