› 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 · Apr 7, 2020 · 3703 views
    This topic created in 2365 days ago, the information mentioned may be changed or developed.

    表 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 replies  •  2020-04-09 20:26:35 +08:00
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       Apr 7, 2020
    表 order (订单基本信息),有以下字段:oid:int,自增主键 opids:varchar,值类似“3,4","5,"6,7,8",意思是这个订单,包含了哪几个产品(对应 product 表里 pid 字段) ocomment:varchar,备注信息,关键字查询要查到此字段

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

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