我有一个名为"item“的表,如下所示:
itemId itemName
001 Chicken Chop
002 Mushroom Chicken
003 Grilled Chicken
004 Chicken Maryland然后,我有一个名为"genRecom“的表,如下所示:
id orderItem1 recomItem1
359 001 002
360 001,003 002
361 001 002,003
362 001 003
363 001,002 003从上面的两个表中,我希望我的表"Recom“如下:
id orderItem1 recomItem1
359 Chicken Chop Mushroom Chicken
360 Chicken Chop, Grilled Chicken Mushroom Chicken
361 Chicken Chop Mushroom Chicken, Grilled Chicken
362 Chicken Chop Grilled Chicken
363 Chicken Chop, Mushroom Chicken Grilled Chicken有谁知道我应该如何组合这两个代码来生成一个像我上面提到的那样的表"Recom“?谢谢你的帮助。
发布于 2017-04-07 00:10:48
不应存储分隔值。你应该对数据进行规范化。表示一个单元格中的一个值。
现在可以通过find_in_set使用下面的查询
select
g.id,
group_concat(i1.itemName order by i1.itemId) as orderItem1,
group_concat(i2.itemName order by i2.itemId) as recomItem1
from genRecom g
join item i1 on find_in_set(i1.itemId, g.orderItem1) > 0
join item i2 on find_in_set(i2.itemId, g.recomItem1) > 0
group by g.id;Demo
根据当前存储的数据,只有当Item表中的itemId列是具有完全相同数量的零的varchar类型时,这才有效。
请注意,上面的查询是不可Sargable的,这意味着它不能使用索引,因此可能会导致性能问题。
如果您在genRecom表中存储数据的方式稍有不同(这两列的类型可以是int。类似地,item表中itemId的类型可以是int):
id orderItem1 recomItem1
01 001 002
02 001 002
02 003 002
03 001 002
03 001 003
04 001 003然后,这是一个简单的连接:
select
g.id,
group_concat(i1.itemName order by i1.itemId) as orderItem1,
group_concat(i2.itemName order by i2.itemId) as recomItem1
from genRecom g
join item i1 on i1.itemId = g.orderItem1
join item i2 on i2.itemId = g.recomItem1
group by g.id;这将表现得更好,并且是Sargable。
Demo
编辑:
上面的查询产生了您预期的输出。如果你不想得到逗号分隔的输出,只需单独使用join:
select
g.id,
i1.itemName as orderItem1,
i2.itemName as recomItem1
from genRecom g
join item i1 on i1.itemId = g.orderItem1
join item i2 on i2.itemId = g.recomItem1;https://stackoverflow.com/questions/43260228
复制相似问题