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



我有一个数据库,其中包含数百个蛋糕和每个蛋糕的不同关键字。在这个例子中,我想要实现的是首先匹配至少有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

相关内容

  • 没有找到相关文章

最新更新