Sql 基于多个ID选择';他在同一列

Sql 基于多个ID选择';他在同一列,sql,join,select,Sql,Join,Select,我已经构建了两个SQL表(不是我自己): 一个表,其中包含分配了ID的所有成分: IngredientID | IngredientName 1 | Milk 2 | Eggs 3 | Flower 第二个表包含成品,这些成品在ProductComponents列中引用了IngredenId,但没有产品名称,它们的构建方式如下: ProductID | ProductName | ProductIngredients 1

我已经构建了两个SQL表(不是我自己):

一个表,其中包含分配了ID的所有成分:

IngredientID | IngredientName
1            | Milk
2            | Eggs
3            | Flower
第二个表包含成品,这些成品在ProductComponents列中引用了IngredenId,但没有产品名称,它们的构建方式如下:

ProductID | ProductName | ProductIngredients
1         | Tomato Soup | NULL
2         | Pancakes    | ;1;2;3
3         | Omlette     | ;1;2
ProductID | ProductName | ProductIngredients
1         | Tomato Soup | 
2         | Pancakes    | Milk, Eggs, Flower
3         | Omlette     | Milk, Eggs
如果它们没有任何引用,则其写为空,如果它们有,则以“;”符号开始,并且每个成分都被“;”符号分割

我的目标是联接这两个表,并生成一个select语句,该语句返回所用成分的实际名称,而不是另一列的ID,如下所示:

ProductID | ProductName | ProductIngredients
1         | Tomato Soup | NULL
2         | Pancakes    | ;1;2;3
3         | Omlette     | ;1;2
ProductID | ProductName | ProductIngredients
1         | Tomato Soup | 
2         | Pancakes    | Milk, Eggs, Flower
3         | Omlette     | Milk, Eggs

有人能帮上忙吗?

您需要产品成分的左连接,并按产品分组:

select p.ProductID, p.ProductName,
  group_concat(i.IngredientName order by i.IngredientID) ProductIngredients
from Products p left join Ingredients i
on concat(p.ProductIngredients, ';') like concat('%;', i.IngredientID,';%')
group by p.ProductID, p.ProductName
函数
group_concat()
在MySql中工作,但您可以找到与其他数据库类似的函数。
请参阅。
结果:


如果您多次运行查询,它将改变演示中成分的顺序。编辑:太好了!这肯定比我想做的要好,现在每次都会返回正确的订单。@Dresden这是通过订单解决的。。。内部组_concat()。我编辑了。修复你的数据模型!不要将数字列表存储为字符串。这是在数据库中存储值的错误方法。