这是一个非常糟糕的数据库设计,正确的答案是改变它。理想情况下,您应该为蛋糕和配料设置单独的表,然后将第三个表用于将蛋糕 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
如果无法更改数据库设计,您可以添加更多语句以说明更多可能的成分。