mysql视图出现重复数据的解决方法

时间:2019-05-13 03:08:41

标签: mysql

我创建了一个有6个表的视图,但是每个顺序有多个数据。 删除两个表后,视图的数据发生了更多变化。 以下是四个表的结构和视图的结构:

CREATE TABLE `order_content` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_no` char(50) NOT NULL COMMENT '订单编号',
  `sku_no` char(20) NOT NULL COMMENT '商品sku编号',
  `gnum` int(11) NOT NULL COMMENT '订单内序号',
  `qty` int(11) NOT NULL COMMENT '购买数量',
  `price` decimal(10,2) NOT NULL COMMENT '商品出售时售价',
  `grossWeight` char(10) DEFAULT NULL COMMENT '毛重',
  `netWeight` char(10) DEFAULT NULL COMMENT '净重',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1211 DEFAULT CHARSET=utf8
CREATE TABLE `st_put_stock` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品入库信息表',
  `sn` char(50) NOT NULL COMMENT '商品SN吗',
  `sku` char(50) NOT NULL COMMENT '18位随机',
  `supplier` int(5) NOT NULL COMMENT '供应商supplier表id',
  `quantity` int(10) NOT NULL COMMENT '数量',
  `report_id` char(50) NOT NULL COMMENT '关单号(批次)',
  `manufacture` char(15) NOT NULL COMMENT '生产日期的时间戳',
  `declare` char(15) NOT NULL COMMENT '入仓的时间戳',
  `create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间戳',
  `depot_id` char(30) NOT NULL COMMENT '仓位号',
  `record_no` char(50) NOT NULL COMMENT '账册号',
  `is_allot` int(1) NOT NULL DEFAULT '0' COMMENT '是否调拨 0 非调拨  1 调拨',
  `price` decimal(10,2) DEFAULT NULL COMMENT '商品售价::::::(售价)',
  `remark` char(200) DEFAULT NULL COMMENT '备注',
  `valid` int(11) NOT NULL DEFAULT '0' COMMENT '0 有效 1 无效',
  PRIMARY KEY (`id`),
  KEY `sn` (`sn`,`sku`)
) ENGINE=MyISAM AUTO_INCREMENT=1050 DEFAULT CHARSET=utf8
CREATE TABLE `st_goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品信息表',
  `p_name_e` varchar(50) NOT NULL COMMENT '电商平台上的商品名称',
  `sn` char(50) NOT NULL COMMENT '商品SN码',
  `country` char(50) NOT NULL COMMENT '原产国',
  `gmodel` char(200) NOT NULL COMMENT '商品规格型号',
  `p_unit` char(30) NOT NULL COMMENT '计量单位',
  `p_price` decimal(10,2) NOT NULL COMMENT '商品销售价格(税前价)',
  `p_weight` float(10,2) NOT NULL COMMENT '商品重量,KG',
  `p_l` float(3,1) NOT NULL COMMENT '商品长,cm',
  `p_w` float(3,1) NOT NULL COMMENT '商品宽 , cm',
  `p_h` float(3,1) NOT NULL COMMENT '商品高 ,cm',
  `p_package` char(10) NOT NULL COMMENT '商品包装',
  `tax` float(10,5) NOT NULL COMMENT '税率',
  `unit1` char(30) NOT NULL COMMENT '法定计量单位',
  `unit2` char(30) NOT NULL COMMENT '第二计量单位',
  `inspGoodsRegNo` varchar(100) DEFAULT NULL COMMENT '商品备案号(检)',
  `inspProdBrdCn` varchar(100) DEFAULT NULL COMMENT '中文品牌(检)',
  `inspProdBrdEn` varchar(100) DEFAULT NULL COMMENT '英文品牌(检)',
  `inspQtyUnitCode` varchar(100) DEFAULT NULL COMMENT '数量单位代码(检)',
  `inspPackNumber` varchar(100) DEFAULT NULL COMMENT '包装数量(检)',
  `gross_weight` decimal(11,2) DEFAULT NULL COMMENT '商品毛重(KG)',
  `create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间戳',
  `inspCurrUnit` char(20) DEFAULT NULL COMMENT '货币单位代码(国检),填写国检币制参数表中编号',
  `inspOriCtryCode` char(20) DEFAULT NULL COMMENT '原产国代码(国检),填写国检国家参数表中编号',
  `inspPackTypeCode` char(20) DEFAULT NULL COMMENT ' 包装类型代码(国检,填写国检包装类型参数表中编号',
  `inspProdSpecs` char(100) DEFAULT NULL COMMENT '商品规格型号(国检),满足国检监管的要求为准。包括:品名、牌名、规格、型号、成份、含量、等级等',
  `inspGrossWeight` decimal(19,2) DEFAULT NULL COMMENT '商品毛重',
  `inspProdCbecCode` char(30) DEFAULT NULL COMMENT '产品国检备案编号(国检),商品在国检备案的编号',
  `hs` char(100) DEFAULT NULL COMMENT 'hs编码',
  `ciq_name` varchar(100) DEFAULT NULL COMMENT '商品报关名称',
  `ciq_sku` char(20) DEFAULT NULL COMMENT '商品报关代码',
  `ciq_country` char(5) DEFAULT NULL COMMENT '原产国代码(关)',
  `ciq_unit1` char(5) DEFAULT NULL COMMENT '法定计量单位代码',
  `ciq_unit2` char(5) DEFAULT NULL COMMENT '法定第二计量单位代码',
  `ciq_price` decimal(10,2) DEFAULT NULL COMMENT '商品备份价格',
  `category` char(100) DEFAULT NULL COMMENT '产品类别',
  `unit2_quantity` char(10) DEFAULT NULL COMMENT '第二计量单位数量',
  `country_id` char(11) DEFAULT NULL COMMENT '商品原产国代码(关)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sn` (`sn`)
) ENGINE=MyISAM AUTO_INCREMENT=786 DEFAULT CHARSET=utf8
CREATE TABLE `brush_account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku` char(50) NOT NULL COMMENT 'sn码',
  `price` decimal(10,2) NOT NULL COMMENT '价格',
  `account_id` int(11) NOT NULL COMMENT '内部生成订单账号',
  PRIMARY KEY (`id`,`sku`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=196 DEFAULT CHARSET=utf8

这是视图的结构

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` SQL SECURITY DEFINER VIEW `brush_stock_goods` AS 
select  `pt`.`record_no` AS `record_no`,  `oc`.`order_no` AS `order_no`,  `g`.`sn` AS `sn`,  `g`.`p_name_e` AS `p_name_e`,  `oc`.`sku_no` AS `sku_no`,  `oc`.`gnum` AS `gnum`,  `oc`.`price` AS `price`,  `oc`.`qty` AS `qty`,  `pt`.`report_id` AS `report_id`,  `g`.`inspGoodsRegNo` AS `inspGoodsRegNo`,  `g`.`inspProdBrdCn` AS `inspProdBrdCn`,  `g`.`inspQtyUnitCode` AS `inspQtyUnitCode`,  `g`.`inspProdBrdEn` AS `inspProdBrdEn`,  `g`.`inspPackNumber` AS `inspPackNumber`,  `g`.`inspCurrUnit` AS `inspCurrUnit`,  `g`.`inspOriCtryCode` AS `inspOriCtryCode`,  `g`.`inspPackTypeCode` AS `inspPackTypeCode`,  `g`.`inspProdSpecs` AS `inspProdSpecs`,  `g`.`inspGrossWeight` AS `inspGrossWeight`,  `g`.`inspProdCbecCode` AS `inspProdCbecCode`,  `ba`.`account_id` AS `account_id`,  `g`.`gross_weight` AS `gross_weight`,  `g`.`create` AS `create`,  `g`.`hs` AS `hs`,  `g`.`ciq_name` AS `ciq_name`,  `g`.`ciq_sku` AS `ciq_sku`,  `g`.`ciq_country` AS `ciq_country`,  `g`.`ciq_unit1` AS `ciq_unit1`,  `g`.`ciq_unit2` AS `ciq_unit2`,  `g`.`ciq_price` AS `ciq_price`,  `g`.`category` AS `category`,  `g`.`unit2_quantity` AS `unit2_quantity`,  `g`.`country_id` AS `country_id`,  `oc`.`id` AS `id`,  `g`.`p_weight` AS `p_weight` from (((`order_content` `oc`  join `st_put_stock` `pt`  on ((`oc`.`sku_no` = `pt`.`sku`)))  join `st_goods` `g`  on ((`pt`.`sn` = `g`.`sn`)))  join `brush_account` `ba`  on ((`oc`.`sku_no` = `ba`.`sku`)))

我尝试了很多方法,但是我对数据库了解不多,所以无法解决问题。我想我增加了更少的限制。

我想要一个内容中的数据,每个订单中的sku只有一个数据,并且出现这种情况的原因,谢谢

1 个答案:

答案 0 :(得分:0)

本质上,您的查询可以归结为:

SELECT lots
     , of
     , columns
  FROM order_content oc
  JOIN st_put_stock pt
    ON oc.sku_no = pt.sku
  JOIN st_goods g
    on pt.sn = g.sn
  join brush_account ba
    on oc.sku_no = ba.sku;

这是一个非常简单的查询,因此不会出错。如果您需要更复杂的东西,那么我们真的需要查看一些样本数据和所需的结果,但是我建议您首先简化问题,将其简化为基本要点。