我有一个数据库,每个蛋糕有数百个蛋糕和不同的关键字。在这个例子中,我想要实现的是首先匹配至少有2个相似关键字的蛋糕 - 在这个例子中它将是蛋糕1和4.(不知道如何在这里做一个表,但我列出了ids 1- 4然后是一个名为成分的列,显示每个id的三个成分。)然后我想展示它们。听起来很容易,但到目前为止我还没有成功。任何帮助表示赞赏。
表名:甜点
id成分
1--软糖,焦糖,椰子 -
香草,榛子,椰子 -
香草,巧克力,软糖 -
4.软糖,焦糖,香草 -
基本上,我想要展示所有含有两种或更多相同成分的蛋糕。不知道如何进行查询。
答案 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)
这是一对多关系。
因此,关系表用于将蛋糕映射到成分:
CAKES_INGREDIENTS_REL
id
cakes_id
ingredients_id