0

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

表名:甜点

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

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

4

2 回答 2

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如果无法更改数据库设计,您可以添加更多语句以说明更多可能的成分。

于 2013-05-21T17:06:33.407 回答
0

@Michael - 三张桌子,蛋糕,配料和cakes_ingredients_rel 非常正确。

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

这是多对多的关系。

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

CAKES_INGREDIENTS_REL
id
cakes_id
ingredients_id
于 2015-02-08T20:59:22.513 回答