Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL如何使用SET type选择一个集合包含另一个集合中的一个或多个项的记录_Mysql_Set - Fatal编程技术网

MySQL如何使用SET type选择一个集合包含另一个集合中的一个或多个项的记录

MySQL如何使用SET type选择一个集合包含另一个集合中的一个或多个项的记录,mysql,set,Mysql,Set,我有一个名为“配方”的表格,其中列出了一组名为“配料”的食物,配方中使用的所有食物都仅限于使用少量特定配料 配方表 id int recipeName文本 配料组 我还有一张桌子叫“食物种类”。每个记录都有一个“名称”字段,例如“水果”、“家禽”、“香料”、“肉”。。。还有一种称为“项目”的集合类型,其中包含属于该食品类型的成分。例如,对于“水果”记录,集合可能是“苹果、橘子、梨、香蕉”。 " 食物种类表 id int 类别文本 项目集 我的问题是如何创建一个MySQL查询,从“recipes”

我有一个名为“配方”的表格,其中列出了一组名为“配料”的食物,配方中使用的所有食物都仅限于使用少量特定配料

配方表

id int

recipeName文本

配料组

我还有一张桌子叫“食物种类”。每个记录都有一个“名称”字段,例如“水果”、“家禽”、“香料”、“肉”。。。还有一种称为“项目”的集合类型,其中包含属于该食品类型的成分。例如,对于“水果”记录,集合可能是“苹果、橘子、梨、香蕉”。 "

食物种类表

id int

类别文本

项目集

我的问题是如何创建一个MySQL查询,从“recipes”表中选择所有记录,该表包含“Components”集中给定“items”集中的一个或多个项

因此,用英语来说,我的问题可能是:

“选择成分包含一种或多种水果的所有配方”

有人能推荐一种使用MySQL查询的好方法吗


注意:我很欣赏有更好的方法来为菜谱/配料问题构建表格,但我正在寻找一种MySQL查询解决方案,它可以通过集合和上述表格来实现这一点。

这是对集合字段的不当使用-如果不进行模式修改,就无法添加食物类型,总是一个很好的指示器,表明你的结构是错误的。使用联接表表示多:多关系。在本例中,创建一个表配料类型,该类型同时引用具有配料id和食品类型id的两个表。这也允许您拥有多种类型的配料,就像一套配料一样,但要灵活得多

ingredient (ingredient):
apple
orange
chicken
ginger
potato

food_type (type):
fruit
vegetable
meat
poultry
spice

ingredient_type (ingredient, type)
apple, fruit
orange, fruit
chicken, meat
chicken, poultry
ginger, vegetable
ginger, spice
potato, vegetable

recipe_ingredient (recipe, ingredient):
recipe1, chicken
recipe1, potato
recipe2, orange
recipe2, ginger
使用该结构,您可以执行如下查询:

SELECT DISTINCT(recipe) FROM recipe_ingredient WHERE ingredient = 'orange';
这将向您展示所有使用橙子的食谱。稍微复杂一点:

SELECT DISTINCT(recipe) FROM recipe_ingredient JOIN ingredient_type on recipe_ingredient.ingredient = ingredient_type.ingredient WHERE ingredient_type.type = 'fruit';
这将找到所有使用任何水果成分的食谱

编辑:关于使用集合

您可以通过利用集合存储的二进制特性来实现这一点。如果配方成分和类别成员之间存在重叠,则按位和使用&运算符的设置位数将大于0:

SELECT DISTINCT recipeName FROM recipes JOIN food_types ON BIT_COUNT(food_types.items & recipes.ingredients) > 0 WHERE food_types.category = 'fruit';
这只有在成分和项目集定义完全相同时才有效

集合还有其他问题:

它们最多只能包含64项 字段值始终与集合的顺序相同 除了简单匹配(例如,在集合中的单个项上进行匹配)之外,大多数查询都没有索引 除非定义相同,否则无法比较集合 没有地方可以放置关于每个项目的附加元数据
这种方法克服了使用关系数据库的大部分优点。这是教科书上第一个标准形式的数据库。对于这样的结构,我所能看到的唯一目的是作为一个如何不这样做的示例。

我同意这是一个更好的实现我所描述内容的方法,但我的示例数据库是一个我试图实现的简化示例,用食品而不是我正在使用的真实物品来表示。例如,在我的例子中,成分可以属于多种食物类型。在使用了集合和我描述的两个表格之后,我仍然在寻找一种方法来完成我正在做的事情。在我的例子中,配料可以属于不止一种类型——看看生姜和鸡肉。你真的不想用集合来解决这个问题。好吧,我同意你的答案对于配料/食谱问题来说是一个更好的解决方案,但对于我的现实生活问题,我仍然坚持我的结构。是否可以使用“我的表”和“我的集合”创建符合我要求的查询?在我的应用程序中,成分和项目集合是相同的。您的查询非常有效。你提到的集合问题对我来说都不是问题,所以我认为集合解决方案并非完全不合适。非常感谢您的解决方案。