V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
shavy
V2EX  ›  MySQL

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

  •  
  •   shavy · 2020-04-07 15:39:37 +08:00 · 2690 次点击
    这是一个创建于 1690 天前的主题,其中的信息可能已经有所发展或是发生改变。

    表 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 重复),要么某些结果缺少订单基本信息,请指教!

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

    最简单的设计也要是这样的结构。
    shavy
        10
    shavy  
    OP
       2020-04-07 15:59:18 +08:00
    @vanton 明白,我先试试改成这个结构,看看能不能查出我要的结果,谢谢!
    xhxhx
        11
    xhxhx  
       2020-04-07 16:04:36 +08:00
    拆成 3 个表 order order_goods goods
    jatesun
        12
    jatesun  
       2020-04-07 16:19:36 +08:00
    9 楼正解,此贴可以终结
    Jrue0011
        13
    Jrue0011  
       2020-04-07 17:08:13 +08:00
    看描述订单 oid 和产品 pid 是多对多关系?然后你还要查产品信息 pinfo 里包含关键词的记录,那应该怎么查都避免不了产品 pid 重复吧?假设一条产品记录的 pinfo 包含了查询关键词,然后有多个订单记录都包含了这个产品,查询结果又包含 pid 和 oid,那相同的 pid 和不同的 oid 就是两条结果
    telami
        14
    telami  
       2020-04-07 17:22:54 +08:00
    嗯,肯定是要搞一个关系表的,明显多对多
    akira
        15
    akira  
       2020-04-07 17:36:08 +08:00
    opids:varchar,值类似“3,4","5,"6,7,8",意思是这个订单,包含了哪几个产品(对应 product 表里 pid 字段)
    ---------------
    这样的设计数据量到千这个规模就会很大概率出现性能问题。参考 11 楼的方案重新设计下表结构关系吧。
    老版本的 wp 也有类似的问题
    shavy
        16
    shavy  
    OP
       2020-04-09 20:26:35 +08:00
    已经按照 9 楼,11 楼的方法,新建了一个对应的表了,谢谢各位!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2501 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:11 · PVG 09:11 · LAX 17:11 · JFK 20:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.