Android SQL-使用子查询的结果

Android SQL-使用子查询的结果,android,sql,json,sqlite,Android,Sql,Json,Sqlite,我的SQLLite数据库中有两个表。我正试图找回那些可以用输入的配料制成的饮料 我正试图表达这个查询以得到我想要的 桌上饮料 纵队 饮料|标识|标题|配料|说明|配料 示例行看起来像 1 |蓝精灵爸爸| 1根压碎的蓝色冰棒,8盎司酷爱,4盎司伏特加|方向| 3 餐桌配料 纵队 饮料|成分 示例行看起来像 1 |蓝色冰棒 我现在的问题 这是我想要返回的部分伪代码(在我得到它之后,我将动态地将术语放入查询中) 我想返回所有输入量等于或大于饮料成分编号的饮料,并且这些输入的成分匹配饮料中所需的所有成分

我的SQLLite数据库中有两个表。我正试图找回那些可以用输入的配料制成的饮料

我正试图表达这个查询以得到我想要的

桌上饮料 纵队

饮料|标识|标题|配料|说明|配料

示例行看起来像

1 |蓝精灵爸爸| 1根压碎的蓝色冰棒,8盎司酷爱,4盎司伏特加|方向| 3

餐桌配料 纵队

饮料|成分

示例行看起来像

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文件创建了这个数据库。您的模式有点奇怪,通常您可能会使用3个表来真正规范化这个数据结构(饮料、配料、饮料配料或类似)。但是,由于您正在进行文本搜索,并且饮料表中已经有了所有配料名称,因此您只需在饮料表上查询即可:

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

确保在“成分”字段上有索引。注意:如果您想退回所有含朗姆酒和/或伏特加的饮料,可以将
更改为

查询问题:

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
)
同样,如果您允许饮料除了所有指定的成分外,还含有额外的成分:

选择饮料.标题,饮料.配料,饮料.说明
从饮料
其中drinks.ingredientsum>=[输入成分的数量]

和[输入成分的数量]这是您的实际模式吗?通过将成分数据包含在两个位置来对其进行非规范化?表之间的关系是什么?看起来您需要一个包含外键id和成分id的联接表。您能澄清一下吗?是的,这是实际的模式。我的意思是我可以改变它,不管它如何最适合最好的查询。我正试图在安卓手机上查询这个问题,希望它能很快完成。我认为将程序(|)中实际delimeter分解的所有成分放入成分表可能会更快。现在我如何使SQL语句确保饮料中的所有成分都满足要求?那么您可能需要考虑规范化数据,因为文本搜索不会得到你想要的。您可能需要对配料进行文本搜索,以确定配料id,然后利用和使用配料多对多联接表进行搜索。为了使用高效的查询,您可能还需要将任务分解为多个查询?我没有做任何改变。我想返回所有满足给定输入的饮料。例如:
饮料需要制作朗姆酒和伏特加,输入是朗姆酒和伏特加。
饮料需要制作朗姆酒、可乐和伏特加,输入是朗姆酒、可乐和伏特加。
我稍微编辑了我想要的。如果输入了3种成分,我想退回含有3种成分的饮料,并且这些成分都与输入的成分匹配。不,该人不能去商店购买他们没有的东西。因此,输入的成分必须等于或大于饮料成分编号,并且成分必须匹配。好的,我想你说得对。我真的很接近。我会尝试一下,然后告诉你怎么做。如果你可以投票支持我的问题,我可以投票支持你的问题(我需要15次重复)。好吧,DB规范化并不是在开好看模式的玩笑。正确完成后,它可以生成更好的查询计划,供DBMS使用,以确定如何实际执行任何查询。此外,它还允许应用程序具有较少(理想情况下无)的数据冗余,从而减少要处理的数据,进而加快执行速度。但根据我的经验,当涉及到移动设备时,这可能是一种过度的杀伤力。
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
)