我有一个数据库,其中包含数百个蛋糕和每个蛋糕的不同关键字。在这个例子中,我想要实现的是首先匹配至少有2个相似关键词的蛋糕——在这个例子中是蛋糕1和蛋糕4。(不知道如何在这里做一个表,但我列出了id 1-4,然后是一个名为ingredients的列,每个id显示三种成分。)然后我想展示给他们看。听起来很简单,但到目前为止我还没有成功。如有任何帮助,不胜感激。
表名称:甜点
id 成分
1、软糖、焦糖、椰子2. 香草、榛子、椰子3.香草、巧克力、软糖4. 软糖、焦糖、香草——
基本上,我想展示所有具有两种或两种以上相同成分的蛋糕。不确定如何进行查询
这是一个非常糟糕的数据库设计,正确的答案是改变它。理想情况下,你应该有单独的蛋糕表和配料表,然后有第三个表将蛋糕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
语句来说明更多可能的成分,如果没有办法改变数据库设计。
@Michael -非常正确,三个表,蛋糕,配料和cakes_配料。
- 蛋糕有很多成分
- 一种配料可用于许多蛋糕
这是一个多对多关系。
因此使用关系表将蛋糕映射到配料:
CAKES_INGREDIENTS_REL
id
cakes_id
ingredients_id