首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在pypmyadmin - MySQL中映射id和名称以形成一个新表

如何在pypmyadmin - MySQL中映射id和名称以形成一个新表
EN

Stack Overflow用户
提问于 2017-04-06 23:58:54
回答 1查看 56关注 0票数 1

我有一个名为"item“的表,如下所示:

代码语言:javascript
复制
itemId  itemName
001     Chicken Chop
002     Mushroom Chicken
003     Grilled Chicken
004     Chicken Maryland

然后,我有一个名为"genRecom“的表,如下所示:

代码语言:javascript
复制
id     orderItem1   recomItem1
359    001          002
360    001,003      002
361    001          002,003
362    001          003
363    001,002      003

从上面的两个表中,我希望我的表"Recom“如下:

代码语言:javascript
复制
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“?谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2017-04-07 00:10:48

不应存储分隔值。你应该对数据进行规范化。表示一个单元格中的一个值。

现在可以通过find_in_set使用下面的查询

代码语言:javascript
复制
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):

代码语言:javascript
复制
id    orderItem1   recomItem1
01    001          002
02    001          002
02    003          002
03    001          002
03    001          003
04    001          003

然后,这是一个简单的连接:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43260228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档