1

我的 SQLLite 数据库中有两个表。我正在努力找回可以用输入的成分制成的饮料。

我正在尝试制定此查询以获得我想要的。

餐桌饮品

饮料ID | 标题 | 成分| 方向 | 成分号

示例行看起来像

1 | 蓝爸爸 | 1 根碎蓝冰棒、8 盎司酷爱饮料、4 盎司伏特加 | 方向 | 3

餐桌配料

饮料ID | 成分

示例行看起来像

1 | 蓝色冰棒

我现在的查询

这是我想要返回的部分伪代码(在我得到这个之后,我会动态地输入要查询的术语)。

我想返回所有输入量等于或大于饮料成分数的饮料,并且这些输入的成分与饮料中所需的所有成分匹配。

SELECT drinks.title, drinks.ingredients, drinks.directions
FROM drinks, (SELECT count(ingredients._id) as ingredientNumber FROM ingredients
WHERE ingredients.ingredient LIKE '%rum%'
GROUP BY ingredients._id) as foundIngredients
WHERE drinks.ingredientsNum = foundIngredients.ingredientNumber;

任何人都可以帮助我获得最适合的查询,甚至给我一些关于重组我的数据库模型的提示吗?我刚刚从一个 80k 行的长 JSON 文件创建了这个数据库。

4

2 回答 2

1

您的架构有点奇怪,因为通常您实际上可能会使用 3 个表来真正规范化此数据结构(饮料、配料、drink_ingredients 或类似的)。但是,由于您正在进行文本搜索,并且您已经在饮料表中获得了所有成分名称,因此您可以简单地在饮料表中查询:

SELECT title, ingredients, directions
FROM drinks
WHERE ingredients LIKE '%rum%'
AND ingredients LIKE '%vodka%'
... // add more ingredients as needed 

确保您在成分字段上有一个索引。请注意,如果您想退回所有带有朗姆酒和/或伏特加的饮料,您可以更改为ANDOR

于 2012-12-05T01:10:59.000 回答
1

反映澄清问题的查询:

SELECT drinks.title, drinks.ingredients, drinks.directions
FROM drinks
WHERE drinks.ingredientsNum = (
    SELECT count(*)
    FROM ingredients
    WHERE (
        ingredients.ingredient LIKE '%rum%'
        OR ingredients.ingredient LIKE '%coke%'
        OR ingredients.ingredient LIKE '%vodka%'
        -- the same goes for each ingredient
    )
    AND ingredients.drink_id = drinks.drink_id
)

同样,如果您允许饮料含有除所有指定之外的额外成分:

SELECT drinks.title, drinks.ingredients, drinks.directions
FROM drinks
WHERE drinks.ingredientsNum >= [number of input ingredients]
AND [number of input ingredients] <= (
    SELECT count(*)
    FROM ingredients
    WHERE (
        ingredients.ingredient LIKE '%rum%'
        OR ingredients.ingredient LIKE '%coke%'
        OR ingredients.ingredient LIKE '%vodka%'
        -- the same goes for each ingredient
    )
    AND ingredients.drink_id = drinks.drink_id
)
于 2012-12-05T01:18:10.123 回答