SQLite - 选择JOIN到多对多和一对多

时间:2016-03-31 15:12:24

标签: sql sqlite

我有一个简单的食谱数据库,我正在尝试编写一个查询,它将提取食谱,以及所有相关的成分和步骤。配方本身与成分有多对多的关系(以促进成分条目的重复使用)和与步骤的一对多关系(一个配方的可能性与另一个配方没有相同的步骤,因此不需要在这里重复使用)。

数据库设置如下:

CREATE TABLE Recipe (
    _id INTEGER PRIMARY KEY,
    recipe_name TEXT UNIQUE NOT NULL
);

CREATE TABLE Ingredient (
    _id INTEGER PRIMARY KEY,
    ingredient TEXT UNIQUE NOT NULL
);

CREATE TABLE RecipeIngredient (
    _id INTEGER PRIMARY KEY,
    recipe_id INTEGER,
    ingredient_id INTEGER,
    amount REAL,
    FOREIGN KEY (recipe_id) REFERENCES Recipe(_id),
    FOREIGN KEY (ingredient_id) REFERENCES Ingredient(_id)
);

CREATE TABLE Step (
    _id INTEGER PRIMARY KEY,
    instruction TEXT NOT NULL,
    number INTEGER NOT NULL,
    recipe_id INTEGER,
    FOREIGN KEY (recipe_id) REFERENCES Recipe(_id)
);

我能够通过_id在所有表格上使用INNER JOINS来提取给定食谱的所有信息(这会产生大量的重复数据),但是我被困在哪里,我怎么能将它分组/订购到使数据有用而无需额外解析结果以获得有意义的对象?这会在2个查询中更好(一个用于成分,一个用于步骤)?

更新

添加从选择一个配方ID返回的一些样本数据,在表之间进行INNER JOIN(按成分/步骤编号排序):

|| recipe ||    || ingredient||  ||step||   ||step number||
"Recipe One"    "Ingredient 1"   "Step 1"         "1"
"Recipe One"    "Ingredient 1"   "Step 2"         "2"
"Recipe One"    "Ingredient 1"   "Step 3"         "3"
"Recipe One"    "Ingredient 2"   "Step 1"         "1"
"Recipe One"    "Ingredient 2"   "Step 2"         "2"
"Recipe One"    "Ingredient 2"   "Step 3"         "3"
"Recipe One"    "Ingredient 3"   "Step 1"         "1"
"Recipe One"    "Ingredient 3"   "Step 2"         "2"
"Recipe One"    "Ingredient 3"   "Step 3"         "3"

1 个答案:

答案 0 :(得分:2)

如果您认为这样,您会注意到将所有这些放在一个查询中是没有意义的。你会期待什么结果?步骤1:加热烤箱,配料是糖,面粉和牛奶。第2步:混合糖和面粉,成分是糖,面粉和牛奶。第3步:加入牛奶,配料是糖,面粉和牛奶......

您真正想要的是成分列表(查询1)和要采取的步骤(查询2)。

我认为这些查询对您来说没有问题,您只是对是否以及如何将它们组合感到困惑。答案很简单:不要。

如果您需要进一步的帮助,请告诉我。