请问 MySQL 这个情况如何联合查询得到正确的结果?

2020-04-07 15:39:37 +08:00
 shavy

表 order (订单基本信息),有以下字段: oid:int,自增主键 opids:varchar,值类似“3,4","5,"6,7,8",意思是这个订单,包含了哪几个产品(对应 product 表里 pid 字段) ocomment:varchar,备注信息,关键字查询要查到此字段

表 product (产品信息),有以下字段: pid:int,自增主键 pinfo:varchar,产品信息,关键字查询要查到此字段

这两个表的用法是,新增一个订单的时候,订单的客户信息、发货地址等都是一样的,所以这些基本信息,都存在 order 表中,然后一个订单可能包含 1 个或者多个产品,产品的具体信息存在 product 表中。然后插入完 product 表的数据后,把 pid 处理并存入到 order 表的 opids 字段中。

现在要查询 ocomment 或 pinfo 中含有“测试”关键字的信息,要求查询的结果以 product 为主,每一条结果,都要有完整的订单基本信息,但是 pid 不重复,比如: pid|pinfo|oid|opids|ocomment ---|:--:|:--:|:--:|:--:| 3|"测试"|1|"3,4"|"" 5|"产品 5 的信息"|2|"5,6,7"|"测试" 6|"产品 6 的信息"|2|"5,6,7"|"测试" 7|"产品 7 的信息"|2|"5,6,7"|"测试" 9|"测试产品 9"|5|"9,10"|""

我之前写了一堆 left jon 或者 group by,都查不到准确的结果,要么重复的结果( pid 重复),要么某些结果缺少订单基本信息,请指教!

2557 次点击
所在节点    MySQL
16 条回复
liprais
2020-04-07 15:41:35 +08:00
表 order (订单基本信息),有以下字段:oid:int,自增主键 opids:varchar,值类似“3,4","5,"6,7,8",意思是这个订单,包含了哪几个产品(对应 product 表里 pid 字段) ocomment:varchar,备注信息,关键字查询要查到此字段

这建模真优秀,先把订单和产品的对应关系找到再说
shavy
2020-04-07 15:45:10 +08:00
@liprais 确实,我是一个菜鸟,但是我来这里提问,正是自身不断提高的过程,你可以不回答,你也可以准确指出问题在哪,但是这样阴阳怪气的回答,就不必要了。
liprais
2020-04-07 15:45:57 +08:00
@shavy 我不是告诉你了么?
先找到订单和产品的对应关系
shavy
2020-04-07 15:47:04 +08:00
@liprais 对应关系就是 order 表里的 opids 字段跟 product 表里的 pid 字段
liprais
2020-04-07 15:48:28 +08:00
@shavy 你再想想
shavy
2020-04-07 15:49:25 +08:00
@liprais 请明示
vanton
2020-04-07 15:50:58 +08:00
结构有点问题,可以试下生成 10 万条订单数据测试下性能。
shavy
2020-04-07 15:54:02 +08:00
@vanton 我自己也是感觉这个结构有点不优雅,但是真不知道要怎么设计,能否明示?
vanton
2020-04-07 15:54:47 +08:00
@shavy #6
订单表,只有订单;
产品表只有产品;
还有个订单商品信息表,一行对应一个订单号和一个产品,多个产品就多行同一个订单 id 各对应一个产品 id 。

最简单的设计也要是这样的结构。
shavy
2020-04-07 15:59:18 +08:00
@vanton 明白,我先试试改成这个结构,看看能不能查出我要的结果,谢谢!
xhxhx
2020-04-07 16:04:36 +08:00
拆成 3 个表 order order_goods goods
jatesun
2020-04-07 16:19:36 +08:00
9 楼正解,此贴可以终结
Jrue0011
2020-04-07 17:08:13 +08:00
看描述订单 oid 和产品 pid 是多对多关系?然后你还要查产品信息 pinfo 里包含关键词的记录,那应该怎么查都避免不了产品 pid 重复吧?假设一条产品记录的 pinfo 包含了查询关键词,然后有多个订单记录都包含了这个产品,查询结果又包含 pid 和 oid,那相同的 pid 和不同的 oid 就是两条结果
telami
2020-04-07 17:22:54 +08:00
嗯,肯定是要搞一个关系表的,明显多对多
akira
2020-04-07 17:36:08 +08:00
opids:varchar,值类似“3,4","5,"6,7,8",意思是这个订单,包含了哪几个产品(对应 product 表里 pid 字段)
---------------
这样的设计数据量到千这个规模就会很大概率出现性能问题。参考 11 楼的方案重新设计下表结构关系吧。
老版本的 wp 也有类似的问题
shavy
2020-04-09 20:26:35 +08:00
已经按照 9 楼,11 楼的方法,新建了一个对应的表了,谢谢各位!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660123

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX