目录
- 背景
- sql 语句
- 总结
背景
一个项目中,商品表和商品码表是一对多的关系,但由于程序没有控制好,导致有些商品码对应有多个商品,为了修正数据,我们得把商品码对应多个商品的商品码找出来.
sql 语句
goods_detail表结构
CREATE TABLE `goods_detail` (`id` bigint(20) NOT NULL COMMENT '主键',`goods_id` bigint(20) NOT NULL COMMENT '商品id',`bar_code` varchar(20) DEFAULT NULL COMMENT '商品码',`library_status` int(1) NOT NULL DEFAULT '1' COMMENT '在库状态 1-在库 2-离库',`out_type` int(1) NOT NULL DEFAULT '3' COMMENT '离库类型 3-未离库 4-出库 5-调拨(出的时候标记)',`goods_status` int(1) NOT NULL DEFAULT '4' COMMENT '是否可用 3-不可用 4-可用'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='商品明细表';
查询商品码对应多个商品的商品码的sql
SELECTd.bar_code AS 商品码,count( DISTINCT d.goods_id ) AS 商品数
FROMgoods_detail d
WHEREd.library_status = 1 AND d.out_type = 3 AND d.goods_status = 4 AND d.bar_code IS NOT NULLAND d.bar_code != ''AND d.bar_code != '0'AND d.bar_code != '无'
GROUP BYd.bar_codeHAVING 商品数 > 1;
查询结果
验证sql
SELECTd.id,d.goods_id,d.bar_code
FROMair_goods_detail d
WHEREd.library_status = 1 AND d.out_type = 3 AND d.goods_status = 4 AND d.bar_code = '202312181250';
随机挑一个商品码查询,果然对应两个不同的商品,sql查询正确。
总结
在上述 sql统计查询中,先按商品码分组,再去重商品id记数(count( DISTINCT d.goods_id )),最后通过HAVING 把统计结果进行过虑,得到最终想要的商品码。