MYSQL将id与列关键字匹配并显示结果

时间:2013-05-21 16:26:23

标签: mysql database match resultset

我有一个数据库,每个蛋糕有数百个蛋糕和不同的关键字。在这个例子中,我想要实现的是首先匹配至少有2个相似关键字的蛋糕 - 在这个例子中它将是蛋糕1和4.(不知道如何在这里做一个表,但我列出了ids 1- 4然后是一个名为成分的列,显示每个id的三个成分。)然后我想展示它们。听起来很容易,但到目前为止我还没有成功。任何帮助表示赞赏。

表名:甜点

id成分
1--软糖,焦糖,椰子 - 香草,榛子,椰子 - 香草,巧克力,软糖 - 4.软糖,焦糖,香草 -

基本上,我想要展示所有含有两种或更多相同成分的蛋糕。不知道如何进行查询。

2 个答案:

答案 0 :(得分:0)

这是一个非常可怕的数据库设计,正确的答案是改变它。理想情况下,您应该有蛋糕和食材的单独表格,然后是第三个将蛋糕ID与成分ID相关联。

但是假设蛋糕总是有三种成分,你可以,尽管你绝对不应该这样做:

SELECT DISTINCT id
FROM (SELECT id, SUBSTRING_INDEX(ingredients,',',1) AS ingredient FROM cakes
     UNION
     SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(ingredients,',',-2),',',1) AS ingredient FROM cakes
     UNION
     SELECT id, SUBSTRING_INDEX(ingredients,',',-1) AS ingredient FROM cakes) AS i
GROUP BY ingredient
HAVING count(*) >= 2

它使用子选择创建三个成分表,每个逗号分隔位置一个,组合为UNION。一旦掌握了这些信息,就可以根据其成分对蛋糕进行分组,并过滤​​掉那些未使用过多次的成分(HAVING条款)。这将为您提供包含非独特成分的蛋糕ID列表。

这是一个可怕的解决方案,如果您有四种或更多成分的蛋糕,则无法使用,但如果无法更改数据库设计,您可以添加更多UNION语句以考虑更多可能的成分。

答案 1 :(得分:0)

<迈克尔 - 非常正确的三张桌子,蛋糕,配料和cake_ingredients_rel。

  • 蛋糕有很多成分
  • 一种成分可用于许多蛋糕

这是一对多关系。

因此,关系表用于将蛋糕映射到成分:

CAKES_INGREDIENTS_REL
id
cakes_id
ingredients_id